我有一个无状态的EJB加入我的数据库。 我需要在JSF 2转换器中使用此bean来从String值参数中检索实体对象。我正在使用JEE6和Glassfish V3。
@EJB
注释不起作用并获得NPE,因为它位于faces上下文中,并且它无法访问EJB上下文。
我的问题是:
是否仍然可以使用@Resource
或其他注释或JNDI查找来注入此bean,还是需要解决方法?
解决方案
执行这样的JNDI查找:
try {
ic = new InitialContext();
myejb= (MyEJB) ic
.lookup("java:global/xxxx/MyEJB");
} catch (NamingException e) {
e.printStackTrace();
}
答案 0 :(得分:6)
我从未使用过JSF 2.0(仅1.0),但规范的第5.4章说:
[...]允许容器注入引用 容器在将资源托管到JSF应用程序之前将其托管到托管bean实例中。 只有 bean 声明在请求中, 会话或应用范围 资源注入。
但到目前为止,据我所知,JNDI查找应该可以解决问题。
答案 1 :(得分:2)
其他(但不那么漂亮)的解决方案可能是使用绑定而不是converterId。仅使用JSF托管bean:
< f:converter binding =“#{app.personConverter}”/>
appBean代表:
@ManagedBean(name="app")
@ApplicationScoped
class AppBean {
@EJB
private PersonService ps;
private Converter personConverter;
}
可能有一个更好的CDI风格的解决方案(JSR-299),但我失败使这个运行:
< f:converter binding =“#{cdiBean}”/>
cidBean应该是:
@Named class CdiBean implements Converter { @EJB ... }
因为要求在构造函数
中传递转换器ID而调用的默认行为失败无论如何首先使用绑定和应用范围的JSF bean 工作。
答案 2 :(得分:2)
JSF 2.0和CDI的Seam Faces扩展允许@Inject直接支持验证器和转换器。
检查出来:http://ocpsoft.com/java/seam-faces-3-0-0-alpha2-jsf-2-0-just-got-even-easier/
答案 3 :(得分:2)
我不知道这个解决方案是否相当......但确实有效:
@ManagedBean
public class AcquisitionConverter implements Converter
{
@EJB
private AcquisitionService service;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
...
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
...
}
}
和
<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}">
使用jsf 2.1.3(mojarra)和glassfish 3.1.1