我无法让@EJB依赖注入工作。我使用Linux和Maven作为构建工具。
对于源代码,IDE和app服务器,我喜欢使用尽可能简单的替代方案。我尝试使用Glassfish 3.1.2.2,NetBeans 7.2,但没有运气。我没有在Glassfish中做过任何配置。
以下是一些示例源代码,但任何有效的代码都会有所帮助。此外,任何有关如何调试这些问题的想法将不胜感激。似乎每个初学者都有它们......
LinkResource.java
package se.xyz.webapp;
import javax.ejb.EJB;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import se.xyz.server.LinkService;
@Path("links/{username}")
public class LinkResource {
@EJB
LinkService service;
@GET
@Produces("text/plain")
public String link(@PathParam("username") @DefaultValue("NoName") String name ) {
return service.store(name); // Always nullpointer exception here!
}
}
LinkServiceImpl.java
package se.xyz.server;
import javax.ejb.Stateless;
@Stateless
public class LinkServiceImpl implements LinkService {
public String store(String name)
{
return "From eJB";
}
}
LinkService.java
package se.xyz.server;
import javax.ejb.Local;
@Local
public interface LinkService {
public String store(String name);
}
显示webapp但变量服务始终为null。让这些代码工作并不是那么重要,但我可以让任何DI工作。在遥远的未来,我也喜欢坚持,但我想手动完成,而不是从一个巨大的工作应用程序。我的目标是了解我在做什么...任何帮助将不胜感激。
答案 0 :(得分:2)
问题是您尝试注入的类是JAX-RS资源。
JAX-RS资源在Java EE中有点疏忽,它涉及托管bean类型的对齐。当Java EE 6被创建时,恰好是JAX-RS(和JSF 2)早期完成,而CDI和总体“托管bean”概念最终完成。
JAX-RS 是容器管理类型的bean,但遗憾的是不是官方的“托管bean”类型,因此它不直接支持@EJB。
您可以将其设为CDI托管bean,然后使用@Inject而不是@EJB。
答案 1 :(得分:1)
如果要将LinkService EJB的引用注入LinkResource资源,那么LinkResource必须是托管组件,换句话说就是无状态会话bean。如果在LinkResource类中添加@Stateless注释,那么你应该没问题。
答案 2 :(得分:1)
需要为每个项目启用上下文和依赖注入。在netbeans中,右键单击您的项目,然后选择New>其他
在类别下选择上下文和依赖注入,然后在文件类型下选择beans.xml。
然后单击“下一步”,然后单击“完成”。
或者您可以在Web Pages / WEB-INF文件夹中手动创建beans.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>