接口 EJB bean 未注入 JAX-RS 实现 class?
Interface EJB bean is not injected in JAX-RS Implementation class?
我正在使用 WAS 8.5、RAD 9.0、JAX-RS 1.1、JavaEE 1.6、EJB 3.0。有WebModule(包含rest classes),EJB Module(包含所有EJB Implementation classes)。
使用 jax-rs 实现 Rest Webservice,并在 PUT 服务调用时获取 NullPointerExpection。
下面是我的代码片段:
Web 模块中的 Servlet web.xml 引用 EJB 模块中的 JAX-RS Class。(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 Class 赞
注意:未使用 @ApplicationPath() 注释。
public class RestServiceInvoke1 extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(ImplementationRest.class);
return classes;
}
}
界面Class喜欢:
注意:@Local 注释包含在接口中 class 那也不起作用
public interface IStudentServices {
public String getValue(String value);
}
@Stateless
public class StudentServiceBean implements IStudentServices {
@Override
public String getValue(String value){
return value;
}
}
和服务实施 Class 如:
@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 个:
1 - servlet 未正确获取对 EJB 的引用。执行 new ImplementationRest
不会产生 EJB,而是一个普通的旧 Java 对象,它不会接收任何注入。 servlet 需要执行 JNDI 查找以获得对 EJB 的引用,或者使用注入; @EJB
或 @Inject
.
2 - 应用程序包括 EJB API 类,特别是 javax.ejb.EJB
,作为应用程序的一部分。当 javax.ejb.EJB
与应用程序一起打包并使用 PARENT_LAST 类加载时,EJB 容器将无法识别 @EJB
注释,因为它是使用应用程序类加载器加载的,并且不会发生注入。
我猜你遇到了问题#1;可能 JAX-RS 1.1 没有识别出 ImplementationRest
是一个 EJB,而只是执行 new 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;
}}
这就是 EJB Bean 类 没有注入到通过 javax.ws.rs.core.Application 实例化的另一个 Bean 的原因。后来我通过 Spring Framework 实现了这个实现,比如 ejb-local-ref in web.xml , bean.xml 中的 jee:jndi-lookup。请使用 IBM 支持 URL。
通过下面 link 总结这个问题。
http://wedowebsphere.de/blogpost/accessing-jpa-jax-rs-service-directly
我正在使用 WAS 8.5、RAD 9.0、JAX-RS 1.1、JavaEE 1.6、EJB 3.0。有WebModule(包含rest classes),EJB Module(包含所有EJB Implementation classes)。 使用 jax-rs 实现 Rest Webservice,并在 PUT 服务调用时获取 NullPointerExpection。
下面是我的代码片段:
Web 模块中的 Servlet web.xml 引用 EJB 模块中的 JAX-RS Class。(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 Class 赞
注意:未使用 @ApplicationPath() 注释。
public class RestServiceInvoke1 extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(ImplementationRest.class);
return classes;
}
}
界面Class喜欢:
注意:@Local 注释包含在接口中 class 那也不起作用
public interface IStudentServices {
public String getValue(String value);
}
@Stateless
public class StudentServiceBean implements IStudentServices {
@Override
public String getValue(String value){
return value;
}
}
和服务实施 Class 如:
@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 个:
1 - servlet 未正确获取对 EJB 的引用。执行 new ImplementationRest
不会产生 EJB,而是一个普通的旧 Java 对象,它不会接收任何注入。 servlet 需要执行 JNDI 查找以获得对 EJB 的引用,或者使用注入; @EJB
或 @Inject
.
2 - 应用程序包括 EJB API 类,特别是 javax.ejb.EJB
,作为应用程序的一部分。当 javax.ejb.EJB
与应用程序一起打包并使用 PARENT_LAST 类加载时,EJB 容器将无法识别 @EJB
注释,因为它是使用应用程序类加载器加载的,并且不会发生注入。
我猜你遇到了问题#1;可能 JAX-RS 1.1 没有识别出 ImplementationRest
是一个 EJB,而只是执行 new 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;
}}
这就是 EJB Bean 类 没有注入到通过 javax.ws.rs.core.Application 实例化的另一个 Bean 的原因。后来我通过 Spring Framework 实现了这个实现,比如 ejb-local-ref in web.xml , bean.xml 中的 jee:jndi-lookup。请使用 IBM 支持 URL。
通过下面 link 总结这个问题。
http://wedowebsphere.de/blogpost/accessing-jpa-jax-rs-service-directly