下面给出了一个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上运行。
答案 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();