3 Replies Latest reply on Oct 6, 2008 7:35 PM by Scott Olcott

    FacesMessages lost when handling an exception

    Scott Olcott Newbie

      I am trying to handle some ConstraintViolationExceptions in the code so that I can provide a user friendly error message. After I add the FacesMessages I throw the exception again so that seam automatically rollsback the transaction.  The problem is that the FacesMessages that I added are not displayed on the page only the messages that was provided in pages.xml for the exception.  Am I doing something wrong? Have others experienced this and is this a bug in seam?  I am using the latest SNAPSHOT of 2.0.3


      Here is an example of what I am doing:


      Here is my action


      public String register() {
        try{
          user.setPassword(DigestUtils.shaHex(user.getPassword()));
          user.setEnabled(true);
          theSession.persist(user);
          theSession.flush();
        }catch(ConstraintViolationException e){
          @SuppressWarnings("unchecked")
            Map<String, String> violatedUniqueConstraints = (Map<String, String>)    theSession.createQuery("select new map(username as username, email as email) from User u " +
                      "where u.username = #{user.username} or u.email = #{user.email}").uniqueResult();
            if(violatedUniqueConstraints.containsKey("username") && violatedUniqueConstraints.get("username").equals(user.getUsername())){
              facesMessages.add("User with username #{user.username} already exists");
            }
            if(violatedUniqueConstraints.containsKey("email") && violatedUniqueConstraints.get("email").equals(user.getEmail())){
              facesMessages.add("User with email #{user.email} already exists");
            }
        //Rethrow the exception so the transaction is rolled back
        throw e;
          }
      }
      



      then in pages.xml if have the following so that it is redirected to the same page it was on



      <exception class="org.hibernate.exception.ConstraintViolationException">
          <redirect>
            <message/>
          </redirect>
        </exception>



      The interesting thing is that if I call


      FacesManager.instance().redirect(Pages.getCurrentViewId());



      before I rethrow the exception all messages are displayed correctly and the code in org.jboss.seam.web.ExceptionFilter.endWebRequestAfterException is also called which is what rolls back the transaction.