起因:
項目開發時遇到一個問題是對於金額類型的字段,數據庫中格式一般為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的值返回。

