5 Replies Latest reply on Apr 26, 2006 3:55 AM by villo

    Cant use EntityManager into Converter

    villo

      Hi there

      I'm experimenting a bit with seam, but I'm currently stuck on this issue...

      I building a simple questionaire page; one has a list of questions with radio answers.

      In order to display answers like:

       <h:column>
       <f:facet name="Answer">
       <h:outputText value="Answers"/>
       </f:facet>
       <h:selectOneRadio value="#{question.selectedAnswer}" converter="#{ansbean.converter}">
       <f:selectItems value="#{question.answerMap}" />
       </h:selectOneRadio>
       </h:column>
      


      I had to write a converter bean, along the lines of the one in the dvd store example. This is basically

      
      @Stateful
      @Name("ansbean")
      @Scope(ScopeType.APPLICATION)
      @Interceptors(SeamInterceptor.class)
      public class AnswersBean implements Answers {
      
       Logger log = Logger.getLogger(Register.class);
       List<Answer> answers;
       Map<String, Answer> answersMap;
      
       @PersistenceContext(type=EXTENDED)
       EntityManager em;
      
       @Create
       public void loadData(){
       //load some stuff from db
       }
       public Converter getConverter() {
       return new AnswerConverter(em);
       }
      
       static public class AnswerConverter implements Converter, Serializable {
      
       Logger log = Logger.getLogger(AnswerConverter.class);
       private EntityManager em;
      
       public AnswerConverter(EntityManager em) {
       this.em = em;
       }
      
       public Object getAsObject(FacesContext facesContext,
       UIComponent uiComponent,
       String value) throws ConverterException {
      
       if ((value == null) || value.length() == 0) {
       return null;
       }
      
       log.info("INTO CONVERTER Asobject()");
      
       int id = Integer.valueOf(value).intValue();
      
       Answer ret = null;
       ret = (Answer) em.createQuery("from Answer where id=?").setParameter(0,id).getSingleResult();
       return ret;
       }
      
       public String getAsString(FacesContext facesContext,
       UIComponent uiComponent,
       Object object) throws ConverterException {
       if (object == null) return null;
      
       return String.valueOf(((Answer) object).getId());
      
       }
       }
      }
      
      


      In my Question entity bean (one to many relationship with Answer) I have
      created an helper method like

      
       @Transient
       public Map<String, Answer> getAnswerMap(){
       Map<String, Answer> results = new TreeMap<String, Answer>();
      
       for (Answer answer : answers) {
       result.put(answer.getText(), answer);
       }
      
       answerMap = results;
       return answerMap;
       }
      
      



      The page loads the questionaire fine, but when I submit it I get the following trace:

      
      11:32:32,734 ERROR [AnswersBean$AnswerConverter] java.lang.NullPointerException
      11:32:32,734 ERROR [STDERR] java.lang.NullPointerException
      11:32:32,735 ERROR [STDERR] at org.jboss.ejb3.entity.ExtendedEntityManager.getPersistenceContext(ExtendedEntityManager.java:59)
      11:32:32,736 ERROR [STDERR] at org.jboss.ejb3.entity.ExtendedEntityManager.createQuery(ExtendedEntityManager.java:129)
      11:32:32,736 ERROR [STDERR] at org.jboss.seam.example.registration.AnswersBean$AnswerConverter.getAsObject(AnswersBean.java:104)
      11:32:32,736 ERROR [STDERR] at org.apache.myfaces.renderkit.RendererUtils.getConvertedUIOutputValue(RendererUtils.java:658)
      11:32:32,736 ERROR [STDERR] at org.apache.myfaces.renderkit.html.HtmlRadioRendererBase.getConvertedValue(HtmlRadioRendererBase.java:288)
      11:32:32,737 ERROR [STDERR] at javax.faces.component.UIInput.getConvertedValue(UIInput.java:289)
      11:32:32,737 ERROR [STDERR] at javax.faces.component.UIInput.validate(UIInput.java:265)
      11:32:32,737 ERROR [STDERR] at javax.faces.component.UIInput.processValidators(UIInput.java:144)
      11:32:32,738 ERROR [STDERR] at javax.faces.component.UIData.process(UIData.java:514)
      11:32:32,738 ERROR [STDERR] at javax.faces.component.UIData.processColumnChildren(UIData.java:498)
      11:32:32,738 ERROR [STDERR] at javax.faces.component.UIData.processValidators(UIData.java:403)
      11:32:32,738 ERROR [STDERR] at javax.faces.component.UIForm.processValidators(UIForm.java:68)
      11:32:32,739 ERROR [STDERR] at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:417)
      11:32:32,739 ERROR [STDERR] at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:142)
      11:32:32,739 ERROR [STDERR] at org.apache.myfaces.lifecycle.LifecycleImpl.processValidations(LifecycleImpl.java:240)
      11:32:32,740 ERROR [STDERR] at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)
      11:32:32,740 ERROR [STDERR] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:106)
      11:32:32,740 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
      11:32:32,740 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      11:32:32,741 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      11:32:32,741 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      11:32:32,741 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      11:32:32,742 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
      11:32:32,742 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
      11:32:32,742 ERROR [STDERR] at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:54)
      11:32:32,743 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174)
      11:32:32,743 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
      11:32:32,743 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
      11:32:32,744 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
      11:32:32,744 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
      11:32:32,744 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
      11:32:32,745 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
      11:32:32,745 ERROR [STDERR] at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
      11:32:32,746 ERROR [STDERR] at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
      11:32:32,746 ERROR [STDERR] at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
      11:32:32,746 ERROR [STDERR] at java.lang.Thread.run(Unknown Source)
      
      
      


      While the page that I'm trying to render contains:

      
      <h:dataTable var="question" value="#{questions}" rendered="#{questions.rowCount>0}">
      <h:column>
       <f:facet name="Question">
       <h:outputText value="Question text"/>
       </f:facet>
       <h:outputText value="#{question.text}" />
       </h:column>
       <h:column>
       <f:facet name="Answer">
       <h:outputText value="Answers"/>
       </f:facet>
       <h:outputText value="#{question.selectedAnswer}"/>
       </h:column>
      
       </h:dataTable>
      
      


      Initially I had no EXTENDED PersistenceContextType but I had a similar NullPointerException in ManagedEntityManagerFactory.getNonTxEntityManager()

      Does this have something to do with that on the second page there's no reference to ansbean?

      Thanks in advance for any hint. I have to say that the seam model is somehow unclear to me yet...



        • 1. Re: Cant use EntityManager into Converter
          gavin.king

          Looks like a bug in JBoss EJB3. I think I have seen someone else report this. Create a simple test case and submit it to EJB3 JIRA.

          What happens if you use:

          @PersistenceContext
           EntityManager em;


          And remove (type=EXTENDED)?

          • 2. Re: Cant use EntityManager into Converter
            gavin.king

            Also, please notice that APPLICATION-scoped stateful session beans are problematic. SFSBs do not support concurrent access. It is better to use a JavaBean component if you need to cache stuff in application scope.

            • 3. Re: Cant use EntityManager into Converter
              villo

               


              What happens if you use:

              Code:

              @PersistenceContext
              EntityManager em;



              And remove (type=EXTENDED)?


              It fails similarly, the same NullPointerException
              at org.jboss.ejb3.entity.ManagedEntityManagerFactory.getNonTxEntityManager(ManagedEntityManagerFactory.java:58)
              


              Should I wrap a testcase including the seam components?

              About the SFSB: I did it this way having looked at the CategoriesBean class in the dvd store example app...

              Actually I did this since I hadn't managed to get the Converter working through faces-config.xml...Is this supposed to be so?






              • 4. Re: Cant use EntityManager into Converter
                gavin.king

                 

                Should I wrap a testcase including the seam components?


                Any *simple* EAR should be fine. But make sure you cut it down to just what is required to reproduce the problem. Thanks.

                About the SFSB: I did it this way having looked at the CategoriesBean class in the dvd store example app...


                Ah. I will fix the DVDStore example. Thanks.

                Actually I did this since I hadn't managed to get the Converter working through faces-config.xml...Is this supposed to be so?


                I don't understand.

                • 5. Re: Cant use EntityManager into Converter
                  villo

                   


                  Quote:
                  Actually I did this since I hadn't managed to get the Converter working through faces-config.xml...Is this supposed to be so?


                  I don't understand.


                  I mean that I wasn't able to use the Converter by registering it with
                  <converter>
                   <converter-for-class>org.jboss.seam.example.registration.Answer</converter-for-class>
                   <converter-class>org.jboss.seam.example.registration.AnswerConverter</converter-class>
                  </converter>
                  


                  So I had to specify the converter with the converter attribute
                  <h:selectOneMenu value="#{register.answer}" converter="#{ansbean.converter}">
                  ...
                  </h:selectOneMenu>
                  


                  And I don't understand why...