2014-01-06 35 views
2

我试图用Resteasy和Jboss as7实现REST服务,我有通过DAO从数据库获取数据的会话bean(它在JSF +托管bean上工作),我想用@EJB注入会话bean,但它返回null,我做错了什么?REST服务中的EJB返回空指针异常

MyRESTApplication.java:

public class MyRESTApplication extends Application { 

    private Set<Object> singletons = new HashSet<Object>(); 
    private Set<Class<?>> empty = new HashSet<Class<?>>(); 
    public MyRESTApplication(){ 
     singletons.add(new TablesResource()); 
    } 
    @Override 
    public Set<Class<?>> getClasses() { 
     return empty; 
    } 
    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

TablesResource.java:

@Path("/RESTService") 
public class TablesResource { 

    @EJB 
    private TablesSB tablesSB; 

    @GET 
    @Produces("application/xml") 
    @Path("/table") 
    public Tables getTable() { 
     return tablesSB.getTable(28); 
    } 
} 

会话bean:

@Stateless 
@LocalBean 
public class TablesSB { 

    @PersistenceContext 
    private EntityManager em; 

    private TablesDAO tablesDao; 
    private TablesDAOxml tablesDaoXml; 

    public TablesSB() { 
    } 

    @PostConstruct 
    public void init(){ 
     //tablesDao = new TablesDAO(em); 
     tablesDaoXml = new TablesDAOxml(); 
    } 

    public Tables getTable(int tableId) { 
     return tablesDaoXml.getTable(tableId); 
    } 
    ... 
} 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>BarBar</display-name> 
    <welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Resteasy</servlet-name> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Resteasy</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
    <context-param> 
    <param-name>javax.ws.rs.Application</param-name> 
    <param-value>ws.MyRESTApplication</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
    </listener> 
</web-app> 

堆栈跟踪:

20:59:06,820 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/BarBar].[Resteasy]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException 
    at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] 
    at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_45] 
Caused by: java.lang.NullPointerException 
    at ws.TablesResource.getTable(TablesResource.java:30) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_45] 
    at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_45] 
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:280) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:234) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:221) [resteasy-jaxrs-3.0.6.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) [resteasy-jaxrs-3.0.6.Final.jar:] 
    ... 19 more 
+0

在.war文件的部署时有任何日志(是否正确部署了EJB)? – Sergio

+0

我不确定,我该如何检查? –

回答

2

我相信这种情况的原因是因为你明确使用RestEasy的。它不能注入EJB,因为它不知道它。你可以尝试用更换上方的整个web.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>BarBar</display-name> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 

    <servlet-mapping> 
     <servlet-name>yourcompany.yourpackage.MyRESTApplication</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

(即取代所有的东西RestEasy的与JAX-RS标准的servlet映射 - 看到JAX-RS 1.1规范,CH 2.3.2。 ;明明用的MyRESTApplication真正完全quallified名称替换yourcompany.yourpackage.MyRESTApplication

或者,javax.ws.rs.ApplicationPath注解你的应用程序类,并从web.xml中删除所有相关的配置:

@ApplicationPath("/*") 
public class MyRESTApplication extends Application { 
    ... 
} 
+0

我会试试它,当我回家时,谢谢:) –

+0

所以我做了两个,它的工作原理,非常感谢你! –

2

Nikos的提示是完全正确的。然而奇怪的是,代码适合你。 在您的代码中,您可以创建TablesResource参数“手动”类。你明确地调用构造函数。

public MyRESTApplication(){ 
    singletons.add(new TablesResource()); 
} 

MyRESTApplication应改变如下。关键是要显示容器应该使用哪个类。它必须自己调用构造函数。

public class MyRESTApplication extends Application { 

    private Set<Object> singletons = new HashSet<Object>(); 
    private Set<Class<?>> classes = new HashSet<Class<?>>(); 

    public MyRESTApplication(){ 
     classes.add(TablesResource.class); 
     // singletons.add(new TablesResource()); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return classes; 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     return singletons; 
    } 
} 

(我有类似的问题,我用上面的修改解决了这个问题,但问题是,从Eclipse的JBoss的工具自动生成的代码“创建示例RESTful服务”。)

0

请加bean.xml文件WEB-INF文件夹并将下面的代码粘贴到bean.xml文件中。

<?xml version="1.0" encoding="UTF-8"?> 

    <beans 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/beans_1_0.xsd"> 

</beans>