【问题标题】:EJB in REST service returns null pointer exceptionREST 服务中的 EJB 返回空指针异常
【发布时间】:2014-01-06 20:01:25
【问题描述】:

我正在尝试使用 Resteasy 和 Jboss as7 实现 REST 服务,我有会话 bean,它通过 DAO 从 DB 获取数据(它适用于 JSF+托管 bean),我想用 @EJB 注入该会话 bean,但它返回null,我做错了吗?

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

【问题讨论】:

  • .war 文件部署时有日志,(EJB 部署是否正确)?
  • 我不确定,如何检查?

标签: rest jakarta-ee jboss ejb


【解决方案1】:

我相信这是因为您明确使用 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>

(即用 JAX-RS 的标准 servlet 映射替换所有 RestEasy 内容 - 请参阅 JAX-RS 1.1 规范,第 2.3.2 章;显然将 yourcompany.yourpackage.MyRESTApplication 替换为真正的完全限定名称 MyRESTApplication

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

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

【讨论】:

    【解决方案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 服务”自动生成的代码。)

    【讨论】:

      【解决方案3】:

      请将 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>
      

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2014-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多