我在使用Spring驗證時遇到覆蓋默認ConstraintValidator消息的問題。無法重寫Spring-MVC中的ConstraintValidator默認消息
我有一個包含下列值的自定義messages.properties文件:
NotNull=This field is mandatory
BankHoliday=You cannot select a bank holiday
我對BankHoliday註解如下:
@Documented
@Constraint(validatedBy = BankHolidayValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BankHoliday {
String message() default "{BankHoliday}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
我的驗證如下:
public class BankHolidayValidator implements ConstraintValidator<BankHoliday, Date> {
@Override
public void initialize(BankHoliday bankHoliday) { }
@Override
public boolean isValid(Date date, ConstraintValidatorContext cxt) {
if(date == null) {
cxt.disableDefaultConstraintViolation();
cxt.buildConstraintViolationWithTemplate("{NotNull}").addConstraintViolation();
return false;
} else if (isBankHoliday(date)) {
return false;
} else {
return true;
}
}
}
我的模型被標註與@BankHoliday註釋:
@BankHoliday
@DateTimeFormat(pattern = "dd/MM/yy")
private Date desiredBookingDate;
我的控制器看起來像:
@RequestMapping(value="/new/request", method = RequestMethod.POST)
public String putNewRequest(@Valid @ModelAttribute("request") Request request, BindingResult bindingResult, Map<String, Object> map) {
if (bindingResult.hasErrors()) {
// return them back
} else {
// process the request
}
}
然而,當用戶不填充這個領域,他們看到錯誤消息是:「你不能選擇銀行假期「而不是」此字段是強制性的「。通過遍歷代碼,我可以看到cxt.disableDefaultConstraintViolation()行肯定會被調用,並且正在添加{NotNull}約束驗證,但用戶始終會看到默認消息。
我試圖用「測試消息」替換「{NotNull}」,這也不起作用。任何人都可以指出我正確的方向,爲什麼這不起作用?
您是否嘗試過使用純Bean驗證的示例?基本上創建一個Validator實例並驗證兩個不同的實例,它們應該返回不同的消息。我基本上想知道這個問題是否發生在Bean Validation(又名Hibernate Validator)或Spring集成中(也許這些消息被緩存!)。這就是說,我同意http://stackoverflow.com/a/25596487/115835 - 它更多的是在Bean Validation的精神下使用約束組合來代替動態改變消息 - http://goo.gl/pLg8Hi – Hardy 2014-09-01 19:19:35
我已經研究過約束組合,這比指針更適合。 – 2014-09-03 17:30:08