Rest JAX-RS实现类中没有注入接口EJB bean?

Rest JAX-RS实现类中没有注入接口EJB bean?,rest,dependency-injection,jax-rs,ejb,websphere,Rest,Dependency Injection,Jax Rs,Ejb,Websphere,我使用的是WAS8.5、RAD9.0、JAX-RS1.1、JavaEE1.6、EJB3.0。WebModulecontains包含rest类,EJB ModuleContains包含所有EJB实现类。 使用jax rs实现Rest Web服务,并在PUT服务调用时获取NullPointerExpection 下面是我的代码片段: web模块中的Servlet web.xml,它引用EJB Module.com.implement.services.RestServiceInvoke中的JAX-R

我使用的是WAS8.5、RAD9.0、JAX-RS1.1、JavaEE1.6、EJB3.0。WebModulecontains包含rest类,EJB ModuleContains包含所有EJB实现类。 使用jax rs实现Rest Web服务,并在PUT服务调用时获取NullPointerExpection

下面是我的代码片段:

web模块中的Servlet web.xml,它引用EJB Module.com.implement.services.RestServiceInvoke中的JAX-RS类

<servlet>
        <description>JAX-RS Tools Generated - Do not modify</description>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
        <init-param>
             <param-name>javax.ws.rs.Application</param-name>
             <param-value>com.implement.services.RestServiceInvoke1</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <enabled>true</enabled>
        <async-supported>false</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <url-pattern>/jaxrs/*</url-pattern>
    </servlet-mapping>
和服务实现类,如:

@Stateless
@Path("partyservices")
@Resource(name="jdbc/dbname", type=DataSource.class)
public class ImplementationRest implements IEmployeeServices {
      @EJB
      private IStudentServices iStudentSerives;

      @PUT
      @Path("/setprimary")
      @Produces(MediaType.APPLICATION_JSON)
      @Consumes(MediaType.APPLICATION_JSON)
      @Override
      public String getValues1(SamplePojo person){
        iStudentSerives.getValue("string");
        return value;
      }
}
iStudnetServices.getValuestring获取NullpointerException。我的意思是IStudentServices不是从容器中注入的。已经在web上经历过类似的错误,但没有解决方案。请帮我解决这个问题。
提前感谢。

有两个常见原因导致您的方案无法按预期工作:

1-servlet未正确获取对EJB的引用。执行新的ImplementationRest不会产生EJB,而是一个普通的旧Java对象,它不会接收任何注入。servlet需要执行JNDI查找以获取对EJB的引用,或者使用注入@EJB或@Inject

2-应用程序包括EJB API类,特别是javax.EJB.EJB,作为应用程序的一部分。当javax.ejb.ejb与应用程序打包并使用父类加载时,ejb容器将无法识别@ejb注释,因为它是由应用程序类加载程序加载的,不会发生注入

我猜你遇到了问题1;JAX-RS 1.1可能没有认识到ImplementationRest是一个EJB,只是在执行一个新的ImplementationRest。

ImplementationRest EJB bean是使用javax.ws.RS.core.Application而不是EJB容器实例化的

public class RestServiceInvoke1 extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(ImplementationRest.class);
    return classes;
}}
这就是EJBbean类没有被注入到通过javax.ws.rs.core.Application实例化的另一个Bean中的原因。之后,我通过Spring框架实现了这个实现,比如web.xml中的ejb-local-ref,bean.xml中的jee:jndi-lookup。请检查IBM支持URL

浏览下面的链接以总结此问题


谢谢@Tracy的宝贵回复。
@Stateless
@Path("partyservices")
@Resource(name="jdbc/dbname", type=DataSource.class)
public class ImplementationRest implements IEmployeeServices {
      @EJB
      private IStudentServices iStudentSerives;

      @PUT
      @Path("/setprimary")
      @Produces(MediaType.APPLICATION_JSON)
      @Consumes(MediaType.APPLICATION_JSON)
      @Override
      public String getValues1(SamplePojo person){
        iStudentSerives.getValue("string");
        return value;
      }
}
public class RestServiceInvoke1 extends Application {

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(ImplementationRest.class);
    return classes;
}}