JSF2: проверка бина с пользовательским пакетом сообщений
Я знаю, что эта проблема обсуждается во многих сообщениях на форуме, однако у меня все еще есть проблемы с настройкой сообщений для проверки bean-компонентов. Может быть, некоторые мелочи отсутствуют в конфигурации или расположении файла...
Когда проверка вызывает сообщение, веб-страница показывает идентификатор сообщения вместо текста сообщения.
Например, я вижу на веб-странице {messages.myMessageId}
Я имею:
SRC / COM / MyApp / View / 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;
Большое спасибо за поддержку!
2 ответа
В соответствии с главой 4.3.1.1 спецификации JSR303, пользовательский файл сообщений проверки JSR303 должен иметь именно то имя ValidationMessages.properties
и он должен быть помещен в корень пути к классам, в вашем случае, таким образом, непосредственно в src
папка.
Обратите внимание, что Bean Validation не является частью JSF. Это часть Java EE, частью которой также является JSF. JSF <message-bundle>
определяет только местоположение сообщений проверки по умолчанию JSF (например, того, которое вы видите на required="true"
), а не сообщения о проверке компонентов JSR303.
Вы можете использовать MessageInterpolator. Если вы используете Hibernate, попробуйте это
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>