默认情况下,Bean Validation 基于 Locale.getDefault() 获取 Locale,这对整个 JVM 是通用的。
如何更改当前 EJB 方法调用的 BeanValidation 的区域设置?
我正在使用 JavaEE7 并希望从 JPA 和 Bean 验证的集成中获益,即插入/更新/删除事件的自动触发验证,并尽可能避免手动编写所有内容。
编辑
毕竟,我只是从 EJB 返回非内插消息:
public class DoNothingMessageInterpolator implements MessageInterpolator {
@Override
public String interpolate(String message, Context context) {
return message;
}
@Override
public String interpolate(String message, Context context, Locale locale) {
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 Web 层插入它们:
try{
//invoke ejb
}catch( EJBException ejbex ){
if( ejbex.getCause() instanceof ConstraintViolationException ){
ConstraintViolationException cve = (ConstraintViolationException) ejbex.getCause();
WebUtils.printConstraintViolationMessages("NewConferenceForm:", context, cve, new Locale(languageCtrl.getLocaleCode()) );
return null;
}else throw ejbex;
}catch( Exception e ){
context.addMessage(null, new FacesMessage( FacesMessage.SEVERITY_ERROR, "Oops.", ""));
return null;
}
public class WebUtils {
public static void printConstraintViolationMessages(
String formPrependId,
FacesContext context,
ConstraintViolationException cve,
Locale locale )
{
Iterator<ConstraintViolation<?>> iter = cve.getConstraintViolations().iterator();
while( iter.hasNext() ){
final ConstraintViolation<?> cv = iter.next();
javax.validation.MessageInterpolator.Context c = new javax.validation.MessageInterpolator.Context()
{
@Override public <T> T unwrap(Class<T> type) {
try {
return type.newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(ConferencesCtrl.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(ConferencesCtrl.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@Override
public ConstraintDescriptor<?> getConstraintDescriptor() {
return cv.getConstraintDescriptor();
}
@Override
public Object getValidatedValue() {
return cv.getInvalidValue();
}
};
ResourceBundleMessageInterpolator rbmi = new ResourceBundleMessageInterpolator();
String interpolatedMsg = rbmi.interpolate(cv.getMessage(), c, locale );
//TODO: check if clientId exists
context.addMessage( formPrependId+cv.getPropertyPath().toString(), new FacesMessage( interpolatedMsg ) );
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想这取决于你的实际意思
如何更改当前 EJB 方法调用的 BeanValidation 的区域设置?
例如,假设每个调用都是由给定用户进行的,并且该用户具有关联的Locale,您将需要一个自定义MessageInterpolator。您可以通过validation.xml配置您的自定义实现(请参阅在线文档中的示例)。
在实施方面,您可以让繁重的工作由授权来完成。一旦确定了区域设置,您的自定义消息插值器就可以实例化默认的 Hibernate 验证器ResourceBundleMessageInterpolator并将插值调用委托给它。后者可以通过ThreadLocaL来实现。EJB 方法将在ThreadLocal中设置用户 Local ,并且您的自定义消息插值器将从那里获取它。
| 归档时间: |
|
| 查看次数: |
5612 次 |
| 最近记录: |