2014-01-06 4 views
2

Resteasy 및 Jboss as7을 사용하여 REST 서비스를 구현하려고하는데, DAO를 통해 DB에서 데이터를 가져 오는 세션 빈이 있습니다 (JSF + 관리 Bean에서 작동 함). 그 세션 빈을 @EJB와 함께 주입하지만, 그것은 null을 반환한다. 나는 잘못된 것을하고 있는가?REST 서비스의 EJB가 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); 
    } 
} 

세션 빈 :

@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> 
,451,515,

스택 추적 :

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를 알지 못하기 때문에 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에 대한 표준 서블릿 매핑 모든 RESTEasy가 물건을 대체 - 채널, JAX-RS 1.1 사양을 참조 2.3.2. ; 분명, 다른 방법으로) MyRESTApplication의 실제 완전 quallified 이름으로

yourcompany.yourpackage.MyRESTApplication을 대체 javax.ws.rs.ApplicationPath와 응용 프로그램 클래스를 주석과의 web.xml에서 모든 관련 구성을 제거 :

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

내가 집에 갈 때, 나는 그것을 시험해 볼 것이다, 고마워. :) –

+0

그래서 나는 둘 다 해냈다. 그리고 그것은 작동한다, 당신에게 그렇게 많이 고맙다! –

2

Nikos의 힌트는 완전히 사실입니다. 그러나 코드가 작동한다는 것은 이상합니다. 코드에서 테이블 리소스의 클래스를 "수동으로"생성합니다. 명시 적 생성자를 호출합니다.

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; 
    } 
} 

(나는 비슷한 문제가 있었다 나는 위의 변경으로 해결. 문제는. "샘플 RESTful 서비스 만들기"를 자동으로 이클립스 J 보스 도구에서 생성 된 코드)

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> 
관련 문제