起因:

  项目开发时遇到一个问题是对于金额类型的字段,数据库中格式一般为BigDecimal类型,两位小数点,然后在接口定义中如果不定义成String类型的话,就不能使用@pattern注解限定格式,而在hibernate的校验里面,没有相关适合的注解使用来限定金额格式,所以需要自定义一个注解来对这类参数进行校验。如果在接口中传入的参数值小数点后不止两位,在mysql中进行插入的时候会自动进行剪切,如传入1.315元,在入库的时候该参数就可能被剪切成1.35元,最终入库数据为1.35。

解决:自定一个Amount的注解来对金额相关字段进行校验

1 自定义一个声明类

package ****************;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=AmountValidator.class)
public @interface Amount { String message() default "{org.validation.constraints.Amount.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

2实现校验方式类   @Constraint(validatedBy=AmountValidator.class)中的  AmountValidator类

package *********;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.math.BigDecimal;
import java.util.regex.Pattern; public class AmountValidator implements ConstraintValidator<Amount, BigDecimal> { /**
* 表示金额的正则表达式
*/
private String moneyReg = "^\\d+(\\.\\d{1,2})?$";
private Pattern moneyPattern = Pattern.compile(moneyReg); @Override
public void initialize(Amount amount) { } @Override
public boolean isValid(BigDecimal value, ConstraintValidatorContext arg1) {
return moneyPattern.matcher(value.toString()).matches();
} }

然后在请求实体bean中需要校验的参数上加上 @Amount注解即可使用

3支持国际化(选)

在你的resource文件夹下加上ValidationMessages.properties文件和 ValidationMessages_zh_CN.properties文件

里面自定义错误信息,当浏览器语言被检测为中文时,系统会查找ValidationMessages_zh_CN.properties该文件下的

org.validation.constraints.Amount.message的值,
若无ValidationMessages_zh_CN.properties文件,则会查找默认文件ValidationMessages.properties中
org.validation.constraints.Amount.message的值返回。

spring框架校验自定义注解的更多相关文章

  1. 使用spring aspect控制自定义注解

    自定义注解:这里是一个处理异常的注解,当调用方法发生异常时,返回异常信息 /** * ErrorCode: * * @author yangzhenlong * @since 2016/7/21 */ ...

  2. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  3. 利用Spring AOP和自定义注解实现日志功能

    Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...

  4. 创建spring管理的自定义注解

    转自: http://blog.csdn.net/wuqiqing_1/article/details/52763372 Annotation其实是一种接口.通过Java的反射机制相关的API来访问A ...

  5. spring框架_IOC与注解

    1.什么是IOC? IoC(Inverse Of Control:反转控制) 2.IOC的作用是什么? 削减计算机程序的耦合(解除我们代码中的依赖关系). 3.关于程序的耦合 /** * 程序的耦合 ...

  6. Spring实现封装自定义注解@Trimmed清除字符串前后的空格

    在Spring中实现字符串清除的方法有很多,原生方法String自带trim()方法,或者使用StringUtils提供的trim...方法. 通常可以将上面的方式封装成自定义注解的形式去实现来节省更 ...

  7. Spring Boot中自定义注解+AOP实现主备库切换

    摘要: 本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的 ...

  8. spring框架学习(四)——注解方式AOP

    注解配置业务类 使用@Component("s") 注解ProductService 类 package com.how2java.service; import org.spri ...

  9. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

随机推荐

  1. 两个Integer变量a和b,值相等,a==b等于多少?

    Integer a = Integer.valueOf(127); Integer b = Integer.valueOf(127);   Integer c = Integer.valueOf(12 ...

  2. ThinkPad T460进不去系统的解决方法

    系统卡在系统lenovo界面的尝试解决方案:开机点击F1进入到bios界面进入Security-Secure Boot选Disabled进入Startup-UEFI选BOTH 然后点击F10 选yes ...

  3. Ignite(二): 架构及工具

    1.集群和部署 Ignite集群基于无共享架构,所有的集群节点都是平等的,独立的,整个集群不存在单点故障. 通过灵活的Discovery SPI组件,Ignite节点可以自动地发现对方,因此只要需要, ...

  4. jquery修改input的值,vue获取不到的解决办法

    $("input[name='aa']").val(2333) //触发一下该input的input事件 $("input[name='aa']")[0].di ...

  5. MySQL中InnoDB锁不住表的原因

    MySQL中InnoDB锁不住表是因为如下两个参数的设置: mysql> show variables like '%timeout%'; +-------------------------- ...

  6. RDLC报表系列--------初级报表

    前面记录下了很多平时开发遇到的问题,RLDC之前也是不会,只会水晶报表,后来也慢慢的也上手了.把这些记录下来,以后用的着 1.打开VS添加新建项,选择Reporting,选择报表,后缀名为RLDC的名 ...

  7. HP880G3 安装RHEL6.5

    ###关于读不到网卡驱动的问题 HP 880G3 在安装系统的时候会提示acpi错误 需要按F9  选择 lency开头走U盘安装系统  进入安装界面按tab 输入 acpi=off 这样就可以安装了 ...

  8. keil_v5生成.bin文件方法

    按ALT+F7,打开如下对话框 如上图,选择 After Build/ Rebuild下的Run#1,输入: C:/keil_v5/ARM/ARMCC/bin/fromelf.exe -bin -o ...

  9. JavaScript数组方法--reduce、reduceRIght、reverse

    今天写的reduce是比较复杂的一个数组方法,其实在这之前我也用过reduce,可是每次用起来总感觉不那么顺手,主要还是因为不熟,对reduce本身不熟.首先reduce这个单词翻译为中文,不那么直观 ...

  10. S表示1,L表示2,计算由S和L组成的序列之和为N的组合

    def func(n): def calc_str(s): s = s.strip() if s is not None else "" s = s.upper() result ...