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 ...
随机推荐
- std::cout和printf
禁止std::cout和printf混用,在多线程环境下可能导致coredump. 说明:printf和std::cout分别为标准c语言与c++中的函数,两者的缓冲区机制不同(printf无缓冲区, ...
- Android官方技术文档翻译——Gradle 插件用户指南(7)
本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build- ...
- 1.1、Libgdx目标和特性
Libgdx是一个通过统一的API工作在所有支持平台(Windows,Linux,Mac OS X,Android,黑莓,HTML/WebGL)的一个Java游戏开发框架. 框架提供了一个快速原型和快 ...
- STL常用查找算法介绍
adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. #include <io ...
- node.js 的url模块
var URL = require('url'); var testUrl = "http://www.baidu.com:8080/index.php?content=abc" ...
- LeetCode之“链表”:Remove Nth Node From End of List
题目链接 题目要求: Given a linked list, remove the nth node from the end of list and return its head. For ex ...
- Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- 如何在ubuntu开启ssh服务-使 SecureCRT远程登录
不少人在第一次使用ubuntu系统的时候,用了很多种方法均没有办法开启SSH服务,ubuntu和其它的linux系统有所区别,因为在ubuntu下,service sshd restart 之类 ...
- sxoi爆炸祭
好吧,纯粹是去玩玩的,我这么一个弱省的蒟蒻,进队纯粹是开玩笑.... Day0 去五中试机,感觉电脑手感不错,打了半个线段树的板子才发现试机要在自己的电脑上试,然后我无奈的搬东西(从26号搬到2号), ...
- tvtk管线技术、数据集与数据加载
管线技术也称流水线技术(Pipeline)每个对象只实现相对简单的任务,整个管线进行复杂的可视化处理在tvtk中分为可视化管线和图形管线 可视化管线(Visualization Pipeline):将 ...