Can't get Seam to Inject objects into a REST interface
mstockbr Dec 3, 2013 7:35 PMI'm developing an application on JBoss7 with Seam 2.3. I've got a REST interface that I'm trying to inject a stateless object into. Unfortunately, despite trying to inject it, and several other things (entitymanager, logger, etc...) absolutely nothing is being injected.
I've followed the instructions here:
For setting up restful web services. My code looks pretty much like the 25.4.2 example. Breaking during a method call to the interface reveals that all objects supposed to be handled by Seam are null (even those marked with create=true). So it appears that Seam is in fact not doing anything with annotated objects in the REST interface.
Interface for the REST interface:
@Local @Remote @Path("/dispatch") public interface DispatchDirectiveREST { @GET @Path("/example/dispatch-directive.rest") @Produces("application/xml") public DirectiveRequestType example(); @POST @Path("/dispatch-directive.rest") @Consumes({"application/xml","application/json"}) @Produces("text/plain") public String dispatch(DirectiveRequestType request);
Implementation (head only) of the REST interface:
@Scope(ScopeType.STATELESS)
@Name("DispatchDirectiveRESTBean")
public class DispatchDirectiveRESTBean implements DispatchDirectiveREST, Serializable {
private static final long serialVersionUID = -2994172323883717503L;
@In(create = true) private CreateDirectiveAsync createDirectiveAsync;
@In(create = true) private CreateDirectiveAysncBean createDirectiveAsyncBean;
@In private EntityManager entityManager;
@Logger private Log logger;
Application defining the REST junk:
@ApplicationPath("/rest")
public class RESTProvider extends Application {
private final static Class<?>[] interfaces = new Class<?>[]{
DispatchDirectiveRESTBean.class,
DispatchDirectiveREST2.class
};
public Set<Class<?>> getClasses() {
return new HashSet<Class<?>>(Arrays.asList(interfaces));
}
Interface defining the CreateDirectiveAsync object (what I actually want to inject):
@Local
public interface CreateDirectiveAsync extends IAsyncTask<DirectiveSeamEntity,Long>{
@Override
@Asynchronous
public Long performTask(DirectiveSeamEntity input, @Expiration Date time);
Implementation of the interface:
@Scope(ScopeType.STATELESS)
@Name("createDirectiveAsyncBean")
public class CreateDirectiveAysncBean implements CreateDirectiveAsync {
@Logger private Log log;
@In private StatusMessages statusMessages;
@In private EntityManager manager;
@Override
@Asynchronous
public Long performTask(DirectiveSeamEntity input, @Expiration Date time) {
Components.xml
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.org/schema/seam/components"
xmlns:core="http://jboss.org/schema/seam/core"
xmlns:persistence="http://jboss.org/schema/seam/persistence"
xmlns:drools="http://jboss.org/schema/seam/drools"
xmlns:bpm="http://jboss.org/schema/seam/bpm"
xmlns:security="http://jboss.org/schema/seam/security"
xmlns:mail="http://jboss.org/schema/seam/mail"
xmlns:web="http://jboss.org/schema/seam/web"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:async="http://jboss.org/schema/seam/async"
xsi:schemaLocation=
"http://jboss.org/schema/seam/core http://jboss.org/schema/seam/core-2.3.xsd
http://jboss.org/schema/seam/persistence http://jboss.org/schema/seam/persistence-2.3.xsd
http://jboss.org/schema/seam/drools http://jboss.org/schema/seam/drools-2.3.xsd
http://jboss.org/schema/seam/bpm http://jboss.org/schema/seam/bpm-2.3.xsd
http://jboss.org/schema/seam/security http://jboss.org/schema/seam/security-2.3.xsd
http://jboss.org/schema/seam/mail http://jboss.org/schema/seam/mail-2.3.xsd
http://jboss.org/schema/seam/web http://jboss.org/schema/seam/web-2.3.xsd
http://jboss.org/schema/seam/components http://jboss.org/schema/seam/components-2.3.xsd
http://jboss.org/schema/seam/async http://jboss.org/schema/seam/async-2.3.xsd">
<core:init debug="true" jndi-pattern="@jndiPattern@"/>
<core:manager concurrent-request-timeout="500"
conversation-timeout="120000"
conversation-id-parameter="cid"
parent-conversation-id-parameter="pid"/>
<!-- Make sure this URL pattern is the same as that used by the Faces Servlet -->
<web:hot-deploy-filter url-pattern="*.seam"/>
<persistence:managed-persistence-context name="entityManager" auto-create="true"
persistence-unit-jndi-name="java:/RnDServerEntityManagerFactory"/>
<drools:rule-base name="securityRules">
<drools:rule-files>
<value>/security.drl</value>
</drools:rule-files>
</drools:rule-base>
<security:rule-based-permission-resolver security-rules="#{securityRules}"/>
<security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/>
<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}"/>
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}"/>
</event>
<!-- This is supposed to be the prefered way of setting up async. It doesn't work. -->
<!-- The line following it fixes the issue. -->
<!-- <async:timer-service-dispatcher/> -->
<component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
<mail:mail-session host="localhost" port="25"/>
<!-- For use with jBPM pageflow or process management -->
<!--
<bpm:jbpm>
<bpm:process-definitions></bpm:process-definitions>
<bpm:pageflow-definitions></bpm:pageflow-definitions>
</bpm:jbpm>
-->
</components>
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>RnDServer</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.seam</url-pattern> <url-pattern>*.html</url-pattern> </servlet-mapping> <context-param> <param-name>org.richfaces.skin</param-name> <param-value>blueSky</param-value> </context-param> <listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener> <filter> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> <filter-mapping> <filter-name>Seam Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>Seam Resource Servlet</servlet-name> <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Seam Resource Servlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <security-constraint> <display-name>Restrict raw XHTML Documents</display-name> <web-resource-collection> <web-resource-name>XHTML</web-resource-name> <url-pattern>*.xhtml</url-pattern> </web-resource-collection> <auth-constraint/> </security-constraint> </web-app>
Any help would be appreciated! Thank you in advance for people who look at this!