2016-03-12 44 views
1

我已经构建了一个用于学习jax-rs和ejb集成的maven项目(packaging:war)。它主要以下文件:JBoss中的JAX-RS(RestEasy)和EJB3集成

无国籍豆

package org.eb.stateless; 
import javax.annotation.PostConstruct; 
import javax.ejb.Stateless; 

@Stateless 
public class StatelessBeanDemo 
{ 
    @PostConstruct 
    public void init() 
    { 
     System.out.println("I M POST-CONSTRUCT"); 
    } 

    public void printData() 
    { 
     System.out.println("I M Stateless"); 
    } 
} 

资源接口

package org.webservice.rs; 
import javax.ejb.Local; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 

@Local 
@Path("/home") 
public interface IHelloWorldService 
{ 
    @GET 
    @Path("/eb/s1") 
    Response callSL1(); 

    @GET 
    @Path("/eb/s2") 
    Response callSL2(); 
} 

资源

package org.webservice.rs; 
import javax.ejb.EJB; 
import javax.ejb.Stateless; 
import javax.inject.Inject; 
import javax.ws.rs.core.Response; 
import org.eb.stateless.StatelessBeanDemo; 

@Stateless 
public class HelloWorldService implements IHelloWorldService 
{ 
    @Inject      // Use of "Inject" 
    private StatelessBeanDemo sl; // Always Null 

    @EJB       // Use of "EJB" 
    private StatelessBeanDemo s2; // Sometime Null, Sometime Not 

    public Response callSL1() 
    { 
     sl.printData(); 
     return Response.status(201).entity("DONE").build(); 
    } 

    public Response callSL2() 
    { 
     s2.printData(); 
     return Response.status(201).entity("DONE").build(); 
    } 
} 

Web服务应用程序Path类

package org.webservice.rs; 
import java.util.HashSet; 
import java.util.Set; 
import javax.ws.rs.core.Application; 

public class RestServiceLocator extends Application 
{ 
    public Set<Class<?>> getClasses() 
    { 
     Set<Class<?>> s = new HashSet<Class<?>>(); 
     s.add(HelloWorldService.class); 
     return s; 
    } 
} 

的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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    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>J2EEDemo</display-name> 

    <context-param> 
     <param-name>resteasy.jndi.resources</param-name> 
     <param-value>java:module/HelloWorldService</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>Resteasy</servlet-name> 
     <servlet-class> 
      org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher 
     </servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>org.webservice.rs.RestServiceLocator</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Resteasy</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

现在,当我打的网址 “http://127.0.0.1:8080/J2EEDemo/home/eb/s1”,这是继空指针异常ALWAYS投掷:

13:59:08,695 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/J2EEDemo].[Resteasy]] (http-0.0.0.0-0.0.0.0-8080-2) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:340) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:214) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:190) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:540) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:502) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.2.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.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.Http11AprProcessor.process(Http11AprProcessor.java:897) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:626) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2039) [jbossweb-7.0.13.Final.jar:] 
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51] 
Caused by: java.lang.NullPointerException 
    at org.webservice.rs.HelloWorldService.callSL1(HelloWorldService.java:26) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_51] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_51] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_51] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_51] 
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:155) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:257) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:211) [resteasy-jaxrs-2.3.2.Final.jar:] 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:525) [resteasy-jaxrs-2.3.2.Final.jar:] 
    ... 

更奇怪的是当我点击“http://127.0.0.1:8080/J2EEDemo/home/eb/s2”时,它是有时候按照我的意愿工作(打印“DONE”并执行注入的bean方法),有时会抛出相同的空指针异常。我无法理解发生了什么。

+0

首先,考虑到您正在处理的上下文,不需要有* web.xml *。看看[这](http://stackoverflow.com/questions/9373081/how-to-set-up-jax-rs-application-using-annotations-only-no-web-xml)后。关于你的's1' bean,因为它不是[托管bean](http://stackoverflow.com/questions/8138232/should-i-use-ejb-or-inject),你不能注入它'@Inject'注释。关于你的's2' bean,你为什么要指定'@ Local'注释? – aribeiro

+0

@aribeiro,我正在关注http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/RESTEasy_EJB_Integration.html的integartion。它在web.xml中使用'@Local'注释。另外,我可能必须从web.xml配置很多东西,所以使用它。 – user811602

+0

@aribeiro,即使删除'@Local'后,行为仍然相同 – user811602

回答

0

我已经通过在WEB-INF(​​)中添加'beans.xml'虚拟文件来解决了这个问题。 (启用CDI)

但问题仍然存在。为什么http://127.0.0.1:8080/J2EEDemo/home/eb/s2工作偶尔,在添加beans.xml之前?