将远程EJB公开为CDI bean

时间:2014-10-25 14:15:18

标签: java-ee ejb cdi java-ee-7 ejb-3.2

下面给出了一个CDI托管bean的例子。

import javax.ejb.EJB;
import javax.inject.Named;
import javax.faces.view.ViewScoped;

@Named
@ViewScoped
public class ZoneManagedBean implements Serializable {

    @EJB
    private ZoneBeanRemote zoneService; //This is a remote EJB.
    private static final long serialVersionUID = 1L;
}

不支持注释@Inject用于将远程EJB注入CDI bean。

如何在此处@EJB替换@Inject


我测试的一些例子不起作用,我认为不需要像这样发布这些例子。

@ApplicationScoped
public class ReomteServiceProvider {

    @EJB
    private ZoneBeanRemote zoneBeanRemote;

    @Produces
    @Default
    public ZoneBeanRemote getZoneBeanRemote() {
        return zoneBeanRemote;
    }
}

当尝试前面的类(带有@Produces注释)时,部署过程将终止,并出现以下异常(无论注释是否为@Alternative@ApplicationScoped和{包含或排除类上方的{1}}):

@Named

P.S:我(目前)使用JDK 8u25在GlassFish Server 4.1上运行。

2 个答案:

答案 0 :(得分:3)

好的,感谢您提供有关详细信息的更新问题。

这里的问题是您的制作人正在使用@Default限定符。为了注射,您的注射点需要看起来像:

@Inject @Default private ZoneBeanRemote zoneBeanRemote;

然后就应该注射好了。

答案 1 :(得分:0)

CDI 不支持远程 ejb 的直接注入,需要在生产者中进行远程查找;

这是一个通过 CDI 与生产者一起使用@Inject 进行远程 ejb 的示例:

生产者(在一个单独的班级中)

@Produces
public RemoteEjbInterface getMyEjb() {
    Properties props = new Properties();
    //omit if the ejb is on the local server
    props.put(Context.PROVIDER_URL, iiopAddressOfTheRemoteServer);
    return (RemoteEjbInterface ) new InitialContext(props).lookup("com.example.RemoteEjbInterface"); 
}

在使用 ejb 的类中:

@Inject RemoteEjbInterface  myEjb;
...
myEjb.businessMethod();

在每次调用 businessMethod 时执行远程查找的注入:

@Inject Instance<RemoteEjbInterface>  myEjb;
...
myEjb.get().businessMethod();