接口EJB bean是否未在JAX-RS实现类中注入?

时间:2018-12-07 09:55:19

标签: rest dependency-injection jax-rs ejb websphere

我正在使用WAS 8.5,RAD 9.0,JAX-RS 1.1,Java EE 1.6,EJB 3.0。有WebModule(包含其余类),EJB Module(包含所有EJB实现类)。 使用jax-rs实现Rest Webservice,并在调用PUT服务时获取 NullPointerExpection

下面是我的代码段:

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

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

JAX-RS类

注意:不使用@ApplicationPath()注释。

public class RestServiceInvoke1 extends Application {

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

接口类,例如:

注意:接口类中包含的@Local注释也无法正常工作

public interface IStudentServices {
 public String getValue(String value);
}

@Stateless
public class StudentServiceBean implements IStudentServices {
   @Override
   public String getValue(String value){
        return value;
   }
}

和服务实现类,例如:

@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.getValue(“ string”)获得NullpointerException。我的意思是IStudentServices不是从容器注入的。已经在网络上遇到了类似的错误,但是没有解决方案。请帮助我解决此问题。 预先感谢。

2 个答案:

答案 0 :(得分:0)

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

1-servlet没有正确获得对EJB的引用。执行~/.berkshelf/config.json不会产生EJB,但是会产生一个普通的旧Java对象,该对象不会收到任何注入。 servlet将需要执行JNDI查找以获得对EJB的引用,或者使用注入。 new ImplementationRest@EJB

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

我猜您正在遇到问题1;可能是JAX-RS 1.1无法识别@EJB是EJB,而只是执行ImplementationRest

答案 1 :(得分:0)

ImplementationRest EJB bean是使用javax.ws.rs.core.Application而不是EJB Container实例化的。

public class RestServiceInvoke1 extends Application {

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

这是未通过Javax.ws.rs.core.Application实例化将EJB Bean类注入到anohter Bean中的原因。之后,我通过 Spring Framework (例如web.xml中的 ejb-local-ref )和bean.xml中的 jee:jndi-lookup 来实现了此实现。请使用IBM支持URL。

通过下面的链接总结此问题。

http://wedowebsphere.de/blogpost/accessing-jpa-jax-rs-service-directly