springboot~为Money类型添加最大值和最小值的注解校验

在spring框架里,为我们集成了很多校验注解,直接在字段上添加对应的注解即可,这些注解基本都是简单保留类型的,即int,long,float,double,String等,而如果你自己封装了新的类,那么如果要校验它,注解这块需要自己写一下,像money这个类型,如果希望对它进行校验,注解这块需要自己去写。

普通类型的注解校验

 /**
   * 编号.
   */
  @NotBlank(message = "部门编号不能为空。")
  private String code;

  /**
   * 名称.
   */
  @NotBlank(message = "部门名称不能为空。")
  private String name;

自定义的注解校验

一 注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

/**
 * 最小值约束.
 */
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MinMoneyHandle.class)
public @interface MinMoney {
  /**
   * message.
   *
   * @return
   */
  String message() default "{minMoney.message.error}";

  /**
   * min value.
   *
   * @return
   */
  double value() default 0;

  /**
   * group.
   *
   * @return
   */
  Class<?>[] groups() default {};

  /**
   * payload.
   *
   * @return
   */
  Class<? extends Payload>[] payload() default {};
}

二 处理类

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.javamoney.moneta.Money;

/**
 * min handle.
 */
public class MinMoneyHandle implements ConstraintValidator<MinMoney, Money> {
  MinMoney constraint;

  public void initialize(MinMoney constraint) {
    this.constraint = constraint;
  }

  /**
   * valid.
   *
   * @param value   .
   * @param context .
   * @return
   */
  public boolean isValid(Money value, ConstraintValidatorContext context) {
    return value.getNumber().doubleValue() >= constraint.value();
  }

}

三 使用,直接在实体上添加对应的注解即可,注解里的字段有自己的默认值,程序员也可以显示为他们赋值

@Builder
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
  private String name;
  private String email;
  @MinMoney(value = 0, message = "金额不能小于0.")
  @MaxMoney(value = 10, message = "金额不能大于10.")
  private Money price;

}

然后通过WebClientTest进行测试即可

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ValidateTest {
  @Autowired
  WebTestClient webTestClient;

  @Test
  public void test() {
    UserInfo entity = UserInfo.builder()
        .price(Money.of(100, "CNY"))
        .build();
    val obj = webTestClient.post()
        .uri("/add")
        .body(BodyInserters.fromObject(entity))
        .exchange()
        .expectStatus().isEqualTo(400)
        .expectBody();

  }
}

感谢各位的阅读!

今天自己写出了这个注解,感谢很有成就,哈哈!

参考文章:http://dolszewski.com/spring/custom-validation-annotation-in-spring/

原文地址:https://www.cnblogs.com/lori/p/9021681.html

时间: 2024-10-11 22:51:42

springboot~为Money类型添加最大值和最小值的注解校验的相关文章

求一个类型的最大值和最小值

#include <stdio.h> #include <limits.h> #define MYMAX(T) \ (- ( ( 1<< ( sizeof ( T ) * 8 - 1 ) ) + 1)) #define MYMIN(T) \ (1 << ( sizeof ( T ) * 8 - 1 )) int main(int argc, char const *argv[]) { printf("%d\n", - ( ( 1<&

C# 各种数据类型的最大值和最小值常数

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TypeMaxMinValue { class Program { static void Main(string[] args) { PrintDataRange(); } static void PrintDataRange() { System.Console.WriteLine("int类型的最大值

42.C#--集合的使用,创建一个集合,里面添加一些数字,求平均值与和,以及最大值,最小值

static void Main(string[] args){//42.集合的使用,创建一个集合,里面添加一些数字,求平均值与和,以及最大值,最小值//创建一个集合ArrayList list = new ArrayList();//向集合添加一些数字list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });//新建sum变量来存储和int sum = 0;//新建一个max来存储最大值int max = (int)list[0];//新建一

使用JavaScript&#183;求数组的最大值和最小值

前言  在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法. 法一:其实利用 ECMAScript5的 ...展开运算符可以很简单的解决这个问题 var arr=[2,7,3,10,22,11]; Math.max(...arr); //44 Math.min(...arr); //2  法二 : 对数组进行遍历 对于数组的遍历,有多种不同的方法,下面对各种方法进行比较:Arr

使用一个函数找出一个整型数组中的最大值和最小值

/***************************************************** 知识点:bool类型,命名空间,输入输出 题目要求: 使用一个函数找出一个整型数组中的最大值和最小值 *****************************************************/ #include<stdlib.h> #include<iostream> using namespace std; namespace CJJ // 定义命名空间

获取数组中元素的最大值、最小值、平均值、总和

1 package com.demo; 2 3 import javax.sound.midi.Soundbank; 4 5 /* 6 * 题目:定义一个int型的一维数组,包含10个元素,分别赋一些随机整数, 7 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出. 8 * 备注:所有随机数都是两位数 9 * 10 * Math.random()可以生成一个double类型随机数,范围是:[0.0, 1.0) 11 * 可以这样生成一个两位数的int类型的随机数:(int)(Math.

获取一组数据的最大值和最小值

对一个数组内部数据为Number类型进行查找,找出最大值和最小值 例如,对 数组 arr = [1,5,48,99,6,5,22,77,1,4,999,1,2]  进行查找 1.使用Math方法 // 查找最小值 Math.min(...arr) // 查找最大值 Math.max(...arr) 2.先排序然后获取第一位和最后一位 // 排序 arr.sort((a, b) => a - b) // 获取最小值 let minVal = arr[0] // 获取最大值 let maxVal =

【Oracle】oracle取最大值和最小值的几个方法汇总

(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man, max(sal) keep(dense_rank FIRST order by sal) over (partition

java实现求一个数组里最大值和最小值之前缺省的数的算法

问题描述: 求一个数组里最大值和最小值之间缺省的数,例如 int arrDemo = {1, 3, 7};  那么就要输出最小值1和最大值7之间缺少的数字2,4,5,6 代码如下,有更好的思路欢迎大家在评论区留言讨论 1 package test; 2 3 public class Test { 4 5 static int[] array = { 6 -10,0,3,3,9 7 }; 8 9 private static void printEmptyItems(int[] array) {