EJB 3.1 - 在一个EJB中使用@EJB - 是否可行?

4

在另一个EJB中使用@EJB注解是否可行?我现在正在尝试这样做,但我的EJB最终为空。下面是我的问题示例:

@Stateless
@LocalBean
@Local(LoginServiceLocal.class)
public class LoginService implements LoginServiceLocal {    

    public void createLogin(String email, String password) { ... }
}

@Stateless
@LocalBean
@Local(AccountServiceLocal.class)
public class AccountService implements AccountServiceLocal {

    @PersistenceContext(unitName = "accounts")
    private EntityManager accountEntityManager;

    @EJB
    private LoginServiceLocal loginService;

    public void createAccount(Account account, String email, String password) {
        accountEntityManager.persist(account);
        loginService.createLogin(email, password);
    }
}

这种情况应该是可以实现的吗?我需要提到,我正在使用嵌入式容器(通过EJBContainer),并且我正在使用JNDI查找AccountService,但是当我尝试在AccountService中调用loginService.createLogin时,loginService为null(没有被@EJB初始化)。我想知道我所做的是否可行。谢谢。

这段代码绝对是符合规范的。你可能遇到了某种不相关的部署问题,所以请检查LoginService是否成功部署。如果您想看到一个使用@EJB引用EJB的工作示例,请访问http://openejb.apache.org/3.0/injection-of-other-ejbs-example.html。 - David Blevins
3个回答

2
是的,这是可能的。
@LocalBean注解可以使EJB暴露无接口客户端视图,因此您将不需要定义本地接口。
另一方面,@Local注解定义了bean的本地客户端接口。
选择以上配置选项之一,不要同时使用两种。
如果您选择使用@LocalBean注解,则删除@Local注解,移除implements关键字,并使用@EJB注解注入bean类名。
如果您选择使用@Local注解,则删除@LocalBean和@Local注解,并使用接口名称使用@EJB注解注入bean。

1
只是需要注意同时使用两者应该没问题。如果它确实影响了什么,那么肯定是一个 bug。 - David Blevins

1

是的,我刚刚在处理一些能够做到这一点的代码。这可能与您创建EJB的方式有关。我只使用注入而不是JNDI查找来完成它。


1
如果您正在使用EJB3.1,您也可以使用来自CDI的@Inject。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接