我无法让 @EJB 依赖注入(inject)工作。我使用 Linux 和 Maven 作为构建工具。
对于源代码、IDE 和应用程序服务器,我喜欢使用使其尽可能简单的替代方案。我尝试了 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);
}
Web 应用程序正在显示,但变量服务始终为空。让这段代码正常工作并不重要,重要的是我能让任何 DI 正常工作。在遥远的 future ,我也想坚持下去,但是我想手动完成,而不是从原型(prototype)中获得一个巨大的工作应用程序。我的目标是了解我在做什么...任何帮助将不胜感激。
最佳答案
问题在于您尝试注入(inject)的类是 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。
关于maven - HelloWorld EJB 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992991/