Hi,

I am working on a project that intends to use a lot of Seam.
Everything worked fine until we had to refactor some of the calls from 
<h:commandButton id="submit" actionListener="#{...}"...> to <f:actionListener 
...> and noticed that the Seam injection doesn't work anymore.

I use Jboss 4.0.4GA and Seam 1.0.1, jsf-facelets 1.1.11, tomahawk 1.1.2

I will attach here snippets of the relevant source code:

First the xhtml page from where you make the call (basically you have some 
templates in which you have a form with buttons, and an <f:actionListener> that 
gets called when the user presses a button):

[...]
  | <ui:composition 
template="/templates/crud-page-template-formatted-input.xhtml">
  | 
  | [...ui defines here...]
  | 
  |     <ui:define name="saveButtonParams">
  |             <f:actionListener 
type="com.nortel.emp.listener.AddRoleListener" />
  |     </ui:define>
  | 
  | [...]
  | 
  | </ui:composition>
  | 
  | </body>
  | </html>

the jsf action listener being called: 

@Name("addRoleListener")
  | @Stateful
  | public class AddRoleListener implements ActionListener{
  | 
  |     @In(value = "roleManagement", create = true, required = true)
  |     private RoleManagementLocal roleManagement;
  |     
  |     public void processAction(ActionEvent evt) throws 
AbortProcessingException {
  |                     [...]
  |                             EmpRole role = new EmpRole();   
  |                             [...]
  |                             roleManagement.add(role);
  |                     [...]
  |     }
  |     
  |     @Create
  |     public void begin() {
  |     }
  | 
  |     /**
  |      * DOCUMENT ME!
  |      */
  |     @Destroy
  |     @Remove
  |     public void destroy() {
  |     }
  | [...]
  | }

the RoleManagement bean:

@Name("roleManagement")
  | @SecurityDomain("emp-mft")
  | @Stateless
  | public class RoleManagementBean implements RoleManagementLocal, 
Serializable {
  |     private static final long serialVersionUID = 6125466770660833929L;
  |     private static final transient Logger logger = 
LoggerFactory.getDebugLogger(RoleManagementBean.class);
  |     private static SecurityDataService securityDataService = null;
  |     @In(value = "userManagement", create = true, required = true)
  |     private UserManagementLocal userManagement;
  |     private ResourceBundle errors = ResourceBundle.getBundle("Errors");
  |   
  | [...]
  | }

The problem is that when roleManagement.add(role); (in AddRoleListener) is 
called, a null pointer exception is thrown (roleManagement is not injected, for 
what I can tell).

In console I get:

  | [debugLog] com.nortel.emp.listener.AppPhaseListener: afterPhase: Start 
RESTORE_VIEW(1)
  | 13:26:46,774 DEBUG [TabManager] Getting tab manager instance: 18510589
  | 13:26:46,775 DEBUG [TabManager] Getting tab manager instance: 18510589
  | 13:26:46,776 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: End RESTORE_VIEW(1)
  | 13:26:46,777 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: Start APPLY_REQUEST_VALUES(2)
  | 13:26:46,778 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: End APPLY_REQUEST_VALUES(2)
  | 13:26:46,779 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: Start PROCESS_VALIDATIONS(3)
  | 13:26:46,780 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: End PROCESS_VALIDATIONS(3)
  | 13:26:46,780 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: Start UPDATE_MODEL_VALUES(4)
  | 13:26:46,781 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: End UPDATE_MODEL_VALUES(4)
  | 13:26:46,782 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: Start INVOKE_APPLICATION(5)
  | 13:26:46,782 INFO  [debugLog] com.nortel.emp.listener.AppPhaseListener: 
afterPhase: End INVOKE_APPLICATION(5)
  | 13:26:46,783 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces 
Servlet threw exception
  | java.lang.NullPointerException
  |         at 
com.nortel.emp.listener.AddRoleListener.processAction(AddRoleListener.java:55)
  |         at 
javax.faces.event.ActionEvent.processListener(ActionEvent.java:48)
  |         at 
javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:484)
  |         at javax.faces.component.UICommand.broadcast(UICommand.java:75)
  |         at 
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:94)
  |         at 
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:168)
  |         at 
org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
  |         at 
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
  |         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at 
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at 
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
  |         at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  |         at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
  |         at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
  |         at 
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
  |         at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
  |         at 
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
  |         at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
  |         at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  |         at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  |         at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  |         at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
  |         at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
  |         at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
  |         at 
org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
  |         at java.lang.Thread.run(Thread.java:595)
                                                        

Note that when using in RoleManagementBean 

    @In(value = "userManagement", create = true, required = true)
  |     private UserManagementLocal userManagement;
  | 

everything is fine.

I am really stuck. I have tried adding interceptors annotation like 

@Interceptors(SeamInterceptor.class)
  | @Intercept(InterceptionType.AFTER_RESTORE_VIEW)

to the AddRoleListener bean (hoping to force Seam to intercept the action 
listener) with no result whatsoever.

For what it seems the call to the ActionListener doesn't get intercepted by 
Seam. If, instead of the @In annotation, I use @EJB I still get the null 
pointer exception.

So, what do I do wrong? From the Seam documentation :

anonymous wrote : Seam even encourages you to use session beans as JSF action 
listeners!

Thanks in advance,
Cristi

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3975473#3975473

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3975473
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to