我在Spring MVC应用程序中实现了一个ReloadableResourceBundleMessageSource,我用它来显示绑定异常的更漂亮的错误消息。我遇到的问题是,由于公司政策,这些错误必须以下列格式显示:
[inputData]不是有效的[fieldName]。
默认情况下,我的消息属性文件中可以访问字段名称(作为{0}参数),但我无法找到显示无效用户输入的方法。这可能吗?
答案 0 :(得分:1)
是,
错误代码不允许您获得用户提供的“价值” - 请参阅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");
*/
}
<强>更新强>
但要实现目标,必须提供自定义messageSource(注意 实现而不是 extends )
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时,您必须查看相同的方法。记住这一点。