I am using as an example the cross field validation described here Cross field validation with Hibernate Validator (JSR 303)
They work perfectly and a javax.ejb.EJBTransactionRolledbackException is thrown with the list of all the violated constraints. But I need the error message to be show in a element. It never is. Is it because this is a class level annotation? The validations that are annotated on the fields always have their messages shown on the page.
Can somebody explain?
Kelly
update:
I wont post the validators because they were copied and pasted from the example on the link but my page is as this
<h:form id="registration_form" class="form-horizontal" prependId="false">
<h:messages errorClass="alert alert-error no-bullets" infoClass="alert alert-info no-bullets" globalOnly="false"/>
<div class="form-actions">
<h:commandButton id="create_button" value="#{label['save']}" action="#{actionBean[save]}" class="btn btn-primary" />
<button class="btn">#{label['cancel']}</button>
</div>
</div>
So, all my error messages should appear on the . My entity bean is like this:
@Entity
@Table(name="user")
@CompareStrings(propertyNames={"password", "passwordConfirmation"})
@NamedQueries({
@NamedQuery(name = User.FETCH_BY_NAME, query = "select u from User u where u.name like :username"),
@NamedQuery(name = User.FETCH_ALL, query = "select u from User u")})
public class User implements Serializable{
private static final long serialVersionUID = 1L;
public static final String FETCH_BY_NAME = "fetchByName";
public static final String FETCH_ALL = "fetchAll";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Column(name = "name")
@NotBlank
@Username
private String name;
.....
}
My managed bean:
@Named("userBean")
@Stateful
@ConversationScoped
public class UserBean implements Serializable {
@Inject
private Conversation conversation;
@EJB
private UserManagerBeanLocal userController;
public String update() {
//calls a method that only has entityManager.persist();
}
}
When the method that has entityManager.persist is called the exception is thrown, all the constraint violations are shown on the stack trace, but none are shown in the page for the @compareStrings. If only the @notblank (or any other annotated on a field) is violated, the message is correctly shown.
update 2
17:10:47,980 ERROR [org.jboss.ejb3.tx2.impl.CMTTxInterceptor] javax.ejb.EJBTransactionRolledbackException: Validation failed for classes [com.sample.domain.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_M ATCH', propertyPath=password, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_M ATCH', propertyPath=passwordConfirmation, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
]
17:10:47,985 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] #{actionBean[save]}: javax.ejb.EJBTransactionRolledbackException: Validation failed for classes [com.sample.domain.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_MATCH', propertyPath=password, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_MATCH', propertyPath=passwordConfirmation, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
]: javax.faces.FacesException: #{actionBean[save]}: javax.ejb.EJBTransactionRolledbackException: Validation failed for classes [com.sample.domain.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_MATCH', propertyPath=password, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
ConstraintViolationImpl{interpolatedMessage='com.sample.business.validation.PASSWORDS_DONT_MATCH', propertyPath=passwordConfirmation, rootBeanClass=class com.sample.domain.User, messageTemplate='com.sample.business.validation.PASSWORDS_DONT_MATCH'}
]
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [:2.1.6-SNAPSHOT]
at javax.faces.component.UICommand.broadcast(UICommand.java:315) [:2.1.6-SNAPSHOT]
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [:2.1.6-SNAPSHOT]
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [:2.1.6-SNAPSHOT]
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [:2.1.6-SNAPSHOT]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [:2.1.6-SNAPSHOT]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [:2.1.6-SNAPSHOT]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [:2.1.6-SNAPSHOT]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274) [:6.1.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final]
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final]
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final]
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final]
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final]
at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final]
at java.lang.Thread.run(Thread.java:662) [:1.6.0_27]