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的值返回。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM