在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 != null && 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/

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

  1. java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列

    1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...

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

    using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO ...

  3. JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出

    rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...

  4. C语言位操作--两整数中的最大值与最小值

    不用选择分支找出指定两整数中的最大值与最小值: int x; int y; // 找出x与y的最大值与最小值 int r; // r保存结果 r = y ^ ((x ^ y) & -(x &l ...

  5. js数组最大值和最小值计算

    基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...

  6. MYSQL 二次筛选,统计,最大值,最小值,分组,靠拢

    HAVING 筛选后再 筛选 SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCO ...

  7. 使用JavaScript·求数组的最大值和最小值

    前言  在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法.   法一:其实利用 ...

  8. MySQL数据类型(最大值 和 最小值)

    MySQL数据类型(最大值 和 最小值) 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-3276 ...

  9. Java数组最大值和最小值

    package com.mybatis.demo.exercise; /** * @author yinsenxin */ public class ArrayMaxAndMin { public s ...

随机推荐

  1. 【一天一道LeetCode】#79. Word Search

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  2. javascript语法之函数案例练习

    需求:文本框内输入月份,弹窗提示本月天数. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  3. 开源网络监控管理系统:OpenNMS

    OpenNMS是一个开源的企业级基于Java/XML的分布式网络和系统监控管理平台.OpenNMS是管理网络的绝好工具,它能够显示网络中各中终端和服务器的状态和配置,为方便地管理网络提供有效的信息. ...

  4. STL - string(典型操作demo)

    1String概念  string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别呢 ...

  5. JavaScript进阶(六)用JavaScript读取和保存文件

    用JavaScript读取和保存文件 因为Google还不提供同步插件数据的功能,所以导入和导出插件配置就必须和文件打交道了.而出于安全原因,只有IE才提供访问文件的API:但随着HTML 5的到来, ...

  6. 对MBProgressHUD第三方进行源码分析

    GitHub源码地址,及时更新:iOS-Source-Code-Analyze MBProgressHUD是一个为iOS app添加透明浮层 HUD 的第三方框架.作为一个 UI 层面的框架,它的实现 ...

  7. SlopOne 改进

    lope One 其基本的想法来自于简单的一元线性模型 $w = f(v) = v + b$.已知一组训练点 ${(v_i, w_i)}_{i=1}^n$,利用此线性模型最小化预测误差的平方和,我们可 ...

  8. Android studio导入工程很卡及下载网络jar很慢问题总结

    AndroidStudio导入项目一直卡在Building gradle project info,实际上是因为你导入的这个项目使用的gradle与你已经拥有的gradle版本不一致,导致需要下载该项 ...

  9. 【编程练习】收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等

    写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...

  10. 真机测试遇到0xE8008016错误修改方法

    错误描述 真机测试过程中,更换Provisioning Profile之后,出现错误:The entitlements specified in your application's Code Sig ...