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 != 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类型添加最大值和最小值的注解校验的更多相关文章
- java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列
1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...
- C# 各种数据类型的最大值和最小值常数
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO ...
- JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...
- C语言位操作--两整数中的最大值与最小值
不用选择分支找出指定两整数中的最大值与最小值: int x; int y; // 找出x与y的最大值与最小值 int r; // r保存结果 r = y ^ ((x ^ y) & -(x &l ...
- js数组最大值和最小值计算
基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...
- MYSQL 二次筛选,统计,最大值,最小值,分组,靠拢
HAVING 筛选后再 筛选 SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCO ...
- 使用JavaScript·求数组的最大值和最小值
前言 在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法. 法一:其实利用 ...
- MySQL数据类型(最大值 和 最小值)
MySQL数据类型(最大值 和 最小值) 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-3276 ...
- Java数组最大值和最小值
package com.mybatis.demo.exercise; /** * @author yinsenxin */ public class ArrayMaxAndMin { public s ...
随机推荐
- android binder理解
Android中的Parcel是什么 Parcel,翻译过来是"打包"的意思.打包干什么呢?是为了序列化. 如果要在进程之间传递一个整数,很简单,直接传就是行了:如果要传 ...
- mixer: mysql协议分析
综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...
- Android Wear开发
Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布).其产品定位也发化了巨大变化,因为Android Wear 1.0通讯方式只有蓝牙,限定了系统,比较依赖手 ...
- Dynamics CRM ADFS及IFD部署后延长系统注销时间
Dynamics CRM 部署IFD后,一段时间后登陆状态会失效,系统会提示让你重新登陆,可以通过延长失效时间来规避 在 powershell中执行如下指令 Set-ADFSRelyingPartyT ...
- EventBus 最简易的使用方式
呃,要跟上时代的步伐,所以来学习一下EventBus(话说好像现在学也已经算是跟不上了..嘛..不管了,一步一步往前追,应该还来得及吧). 转载请注明出处:http://blog.csdn.net/w ...
- gc实例与gc报告的阅读
gc报告的阅读 首先我们看一条gc报告 D:\杂项\java>java -verbose:gc -Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:+ ...
- netty对http协议解析原理解析
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- Java集合之Map
Map架构: 如上图: (1)Map是映射接口,Map中存储的内容是键值对(key-value) (2)AbstractMap是继承于Map的抽象类,实现了Map中的大部分API. (3)Sorted ...
- AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能
在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...
- 增加AP INVOICE 行&分配行
-- 增加行 DECLARE v_row_id VARCHAR2(1000); v_line_number number; g_user_id CONSTANT NUMBER := fnd_globa ...