By default Bean Validation gets Locale based on Locale.getDefault(), which is common to whole JVM.
How to change BeanValidation's Locale for current EJB method call?
I'm using JavaEE7 and want to get benefits from integration of JPA and Bean Validation, i.e. automatic triggering validation on insert/update/delete events, and as far as possible avoid of writing everything manually.
EDIT
After all, I'm just returning non-interpolated messages from 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;
}
}
and later interpolating them in Web tier:
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 ) );
}
}
}