我正在尝试使用 hibernate/persistence 将 Rest Web 服务获取的数据保存到数据库中。 在我的一个网络模块中,我实现了该服务。数据库ejb连接器放置在EJB模块中。它们是 EAR 应用程序的一部分。 每次当我调用 pb.addDevice() 时,在浏览器中输入带有参数的正确 url 时,我都会收到 java.lang.NullPointerException(直到我想将其保存到数据库为止)。找不到它有什么问题。我正在使用 jboss 6.1.0 Final。
尝试过Dependency injection in restful WS的答案
一步一步遵循后,我也得到了空指针
PS。当我从 改变时@EJB
PersistenceBean pb;
至
PersistenceBean pb = new PersistenceBean();
我在 EntityManager em = emf.createEntityManager() 上得到了空指针;
代码:
@Stateless
@Path("/RestService")
public class RestPush {
@EJB
PersistenceBean pb;
@GET
@Path("/RegisterDevice")
public void registerDevice(
@QueryParam("deviceId") String deviceId){
Device d = new Device(true);
d.setId = deviceId;
pb.addDevice(d);
}
}
和 EJB 类:
@Stateless(mappedName = "PersistenceBean")
public class PersistenceBean {
@PersistenceUnit(unitName = "PersistentUnitName")
EntityManagerFactory emf;
private void persist(Object o, EntityManager entityManager) {
try {
entityManager.persist(o);
} catch (Exception e) {
logger.severe("Error writing to DB: " + e);
logger.severe("" + e.fillInStackTrace());
}
}
public void addDevice(Device d) {
try {
EntityManager em = emf.createEntityManager();
if (persist(device, em)) {
logger.info("Device with id : " + device.getId()
+ " has been added ");
} else {
logger.info("Failed to add device with id: " + device.getId());
} catch (Exception e) {
logger.severe("PersistenceBean: Could not save device.");
e.printStackTrace();
}
}
更新:
EAR
--EarContent
--META-INF
--application.xml
EJB
--package in ejbModule
--PersistenceBean
--Device
--META-INF
--ejb-jar.xml
--MANIFEST.MF
--persistence.xml
--beans.xml
Web
--package in webModule
--Rest (auto generated class while creating Webservice)
--RestPush
--WebContent
--META-INF
--MANIFEST.MF
--WEB-INF
--web.xml
--beans.xml
堆栈跟踪:
`10:23:28,629 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/RestWeb].[Resteasy]] Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
at
Caused by: java.lang.NullPointerException
at package.RestPush.registerDevice(RestPush.java:68) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_27]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.6.0_27]
最佳答案
@EJB
注释不应该适用于所有对象。
为此,您需要使用 CDI,因此请替换 @EJB
与 @Inject
并且您的 Bean 将被正确注入(inject)。
另请参阅:Inject an EJB into JAX-RS (RESTful service)
编辑:
另外请务必添加beans.xml
到每个包含您想要注入(inject)或被注入(inject)的类的 jar/war 存档。它进入 META-INF
用于 jar 和 WEB-INF
为了 war 。
您的 REST 应用程序类 packaget.Rest
应该延长javax.ws.rs.core.Application
如:
@ApplicationPath("/root-path")
public class Rest extends Application
{
}
根据文档 here在 JBoss 6.1 REST 和 CDI 上应该可以开箱即用。如果您指定 org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher 和 org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 您可能会搞乱 RestEasy/CDI 类加载。
所以你的web.xml
应该看起来像:
<web-app version="3.0" 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 java.sun.com/xml/ns/javaee/…">
</web-app>
无论如何,我在 github 上推送了一个工作示例
关于java - 无法将 Bean 类注入(inject) Restful Web 服务 (JAX-RS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914671/