[jboss-user] [JBoss Seam] - Problem with injection in an jsf action listener

cristi.ciuc do-not-reply at jboss.com
Mon Oct 2 08:24:27 EDT 2006


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



More information about the jboss-user mailing list