我知道论坛中的很多帖子都讨论过这个问题,但是我仍然无法自定义bean验证的消息。可能在配置或文件位置中缺少一些小东西......
当验证调用该消息时,该网页显示消息ID而不是消息文本。
例如,我在网页{messages.myMessageId}
中看到我有:
的src / COM / MyApp的/视图/ validationvalidation_en.poperties
webuser_name_notnull = Name is required
面-config.xml中
<message-bundle>
com.myapp.view.validation
</message-bundle>
webuser.java
@NotNull(message = "{webuser_name_notnull}")
private String name;
非常感谢您的支持!
答案 0 :(得分:10)
根据JSR303 specification的第4.3.1.1节,自定义JSR303验证消息文件需要具有完全名称ValidationMessages.properties
,并且需要将其放在类路径的根目录中,在您的情况下因此直接在src
文件夹中。
请注意,Bean Validation不是JSF的一部分。它是Java EE的一部分,JSF也是其中的一部分。 JSF <message-bundle>
仅定义JSF默认验证消息的位置(例如您在required="true"
上看到的消息),而不是JSR303 Bean验证消息。
答案 1 :(得分:3)
您可以使用MessageInterpolator。如果你使用休眠试试这个
public class ResourceBundleMessageInterpolator extends org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator implements
MessageInterpolator {
@Override
public String interpolate(String message, Context context, Locale locale) {
// evaluate el expression
if (message != null && message.startsWith("#{")) {
FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp = elFactory.createValueExpression(elContext, message, Object.class);
Object value = valueExp.getValue(elContext);
if (value == null) {
return null;
} else {
return value.toString();
}
} else {
return super.interpolate(message, context, locale);
}
}
}
最后你需要META-INF / validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
<message-interpolator>package.ResourceBundleMessageInterpolator</message-interpolator>
</validation-config>