spring框架校验自定义注解

起因:

  项目开发时遇到一个问题是对于金额类型的字段,数据库中格式一般为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的值返回。

原文地址:https://www.cnblogs.com/aut-lory/p/9233337.html

时间: 2024-11-05 20:38:00

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

Spring框架中利用注解进行自动装配的环境配置步骤和常见问题

第1步:配置XML文件 ,如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.spring

润乾报表设计器中使用 spring 框架实现自定义数据集

spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.在 web 开发环境中经常会与 struts.hibernate联合起来使用,进行规范的框架结构开发.润乾中的二次开发也可以与 SSH 框架相结合部署到 web 项目中.本文介绍在设计时没有启动 web 服务,在设计器中使用 spring 的方式来实现自定义数据集. 实现思路:编写两个自定义数据集,一个在设计器中使用,一个在 web 项目中使用,在设计器中使用的类需要编写临时加载 spring 框架配置文件的代码,启动 spr

Spring框架总结(四)——注解

前面几节,通过配置xml文件,可以实现Spring 控制反转的依赖注入.不过,如果一个类中,存在很多属性.依赖不止一个目标,此时这种基于xml配置的方式就显得非常繁琐.幸好,Spirng提供了几种技巧,可以帮助我们减少xml的配置数量 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让spring自动识别如何装配Bean的依赖关系 自动检测(autodiscovery)比自动装配更进了一步,让Spring能够自

SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件

关于SpringMVC验证框架Validation的使用方法,不是本篇的重点,可参见博文SpringMVC介绍之Validation 在使用Validation时,一定有朋友遇到过一个问题,那就是:无法传递参数到国际化资源文件properties错误描述中. 举个例子: User类中 @NotEmpty(message="{password.empty.error}") private String password; 资源文件validation_zh_CN.properties中为

详解Java的Spring框架中的注解的用法

转载:http://www.jb51.net/article/75460.htm 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... } 配置文件: <bean id=&qu

spring mvc 框架校验常用注解

@AssertFalse 被注解的元素必须为false@AssertTrue 被注解的元素必须为false@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值@DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值@Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内@Future 被注解的元素必须是日期,检查给定的日期是否比现在晚.@Max(value) 被注

Spring框架 之@Valid注解的使用(嵌套类型的效验)

@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能. @Valid 注解类型的使用: @Null限制只能为null @NotNull限制必须不为null @AssertFalse限制必须为false @AssertTrue限制必须为true @DecimalMax(value)限制必须为一个不大于指定值的数字 @DecimalMin(value)限制必须为一个不小于指定值的数字 @Digi

Spring框架的@Valid注解

上一篇文章介绍了springmvc的get请求参数可以是一个自定的对象.那么如何限制这个对象里的参数是否必传呢? 方法一:在代码逻辑里取出对象里的这个值,手动进行判断 方法二:使用@Valid注解,在接口请求的时候让Spring自己进行判断 比较 如果用上面两个方法进行非空判断,当参数传的是空的时候, 方法一的返回结果的状态是 200,方法二的返回结果状态是 400: 方法一需要自定义返回结果并且可以直接在页面中进行展示,方法二的返回结果需要从Response Body中获取. 方法一复杂,方法

spring Aspect 实现自定义注解的日志记录

由于直接拦截所有的controller所以需要spring.xml中添加<aop:aspectj-autoproxy proxy-target-class="true" />  交由cglib代理. 使用只要在controller的method上加上@ActionControllerLog(channel="web",action="user_register",title="用户注册",isSaveRequest