我在我的Spring MVC應用程序中實現了一個ReloadableResourceBundleMessageSource,我使用該應用程序爲綁定異常顯示更漂亮的錯誤消息。我遇到的問題是,由於公司政策,這些錯誤必須以以下格式顯示:用Spring typeMasmatch錯誤獲取無效的用戶輸入
[inputData]不是有效的[fieldName]。
默認情況下,我的郵件屬性文件(作爲{0}參數)可以訪問字段名稱,但我找不到一種方法來顯示無效的用戶輸入。這可能嗎?
我在我的Spring MVC應用程序中實現了一個ReloadableResourceBundleMessageSource,我使用該應用程序爲綁定異常顯示更漂亮的錯誤消息。我遇到的問題是,由於公司政策,這些錯誤必須以以下格式顯示:用Spring typeMasmatch錯誤獲取無效的用戶輸入
[inputData]不是有效的[fieldName]。
默認情況下,我的郵件屬性文件(作爲{0}參數)可以訪問字段名稱,但我找不到一種方法來顯示無效的用戶輸入。這可能嗎?
是,
錯誤標記不會讓你得到你的用戶提供的「價值」 - 參見link
假設在這裏不用你errors.properties(類路徑的根)文件(請注意,我是隻使用一個{0}參數)
// errors.properties
error.invalid=is not a valid {0}
當確認您的命令對象,你做如下
import static org.springframework.validation.ValidationUtils.*;
public boolean validate(Object command, Errors errors) {
Person person = (Person) command;
/**
* new Object [] plays the role of the supplied arguments
*/
rejectIfEmpty(errors, "age", "error.invalid", new Object[] {"Age"}, "Age is required");
/**
* If your label is a resource bundle key, use DefaultMessageSourceResolvable instead
*
* rejectIfEmpty(errors, "age", "error.invalid", new Object[] {new DefaultMessageSourceResolvable("person.age")}, "Age is required");
*/
}
UPDATE
但要獲得你的目標,你必須提供自定義爲messageSource(注意器具代替延伸)
public class PolicyMessageSource implements MessageSource {
private ResourceBundleMessageSource resourceBundle;
public PolicyMessageSource() {
resourceBundle = new ResourceBundleMessageSource();
/**
* Suppose your resource bundle is called messages.properties (root of the classpath)
*/
resourceBundle.setBasenames(new String[] {"messages"});
}
public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
return resourceBundle.getMessage(code, args, defaultMessage, locale);
}
public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
return resourceBundle.getMessage(code, args, locale);
}
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
if(resolvable instanceof FieldError) {
FieldError fieldError = (FieldError) resolvable;
/**
* Here goes what you want
*/
return fieldError.getRejectedValue() + resourceBundle.getMessage(resolvable, locale);
}
return resourceBundle.getMessage(resolvable, locale);
}
}
所以定義PolicyMessageSource如爲messageSource
<bean id="messageSource" class="br.com.spring.PolicyMessageSource"/>
請注意,您必須定義只有一個 messageSource實例調用messageSource。請注意,我正在使用ResourceBundleMessageSource。使用ReloadableResourceBundleMessageSource時,您必須檢查相同的方法。記住這一點。
不幸的是,如上所述,似乎無法擴展ResourceBundleMessageSource(或類似的ReloadableResourceBundleMessageSource)。原因是AbstractMessageSource中的getMessage()方法是最終的。 – TimmyJ 2010-05-10 18:25:21
@TimmyJ好的,蒂米我會告訴你如何才能得到你的目標 – 2010-05-10 19:21:45
工作很好,謝謝! – TimmyJ 2010-05-10 20:15:21