2

我无法让@EJB 依赖注入工作。我使用 Linux 和 Maven 作为构建工具。

对于源代码、IDE 和应用服务器,我喜欢使用尽可能简单的替代方案。我尝试使用 Glassfish 3.1.2.2、NetBeans 7.2 但没有运气。我没有在 Glassfish 中进行任何配置。

这是一些示例源代码,但任何有效的代码都会有所帮助。此外,任何有关如何调试此类问题的想法都将不胜感激。似乎每个初学者都拥有它们...

链接资源.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";
    }
}

链接服务.java

package se.xyz.server;

import javax.ejb.Local;

@Local
public interface LinkService {
    public String store(String name);
}

webapp 正在显示,但变量 service 始终为空。让这段代码工作并不重要,但只要我能让任何 DI 工作就行。在遥远的未来,我也想坚持下去,但是我想手动完成,而不是从原型中获得一个巨大的工作应用程序。我的目标是了解我在做什么......任何帮助将不胜感激。

4

3 回答 3

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。

于 2012-10-21T11:24:21.807 回答
1

如果要将对 LinkService EJB 的引用注入到 LinkResource 资源中,那么您的 LinkResource 必须是托管组件,即无状态会话 bean。如果您在 LinkResource 类中添加 @Stateless 注释,则应该没问题。

于 2012-10-21T07:10:30.610 回答
1

每个项目都需要启用上下文和依赖注入。在 netbeans 中右键单击您的项目并选择新建 > 其他

在类别下选择上下文和依赖注入,然后在文件类型下选择 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>
于 2012-10-21T07:13:15.607 回答