Jsf 如何在@FacesConverter中注入@EJB、@PersistenceContext、@inject、@Autowired等?
如何在Jsf 如何在@FacesConverter中注入@EJB、@PersistenceContext、@inject、@Autowired等?,jsf,dependency-injection,ejb,converter,Jsf,Dependency Injection,Ejb,Converter,如何在@FacesConverter中插入像@EJB、@PersistenceContext、@inject、@AutoWired等依赖项?在我的特定情况下,我需要通过@EJB: @FacesConverter public class MyConverter implements Converter { @EJB protected MyService myService; @Override public Object getAsObject(FacesConte
@FacesConverter
中插入像@EJB
、@PersistenceContext
、@inject
、@AutoWired
等依赖项?在我的特定情况下,我需要通过@EJB
:
@FacesConverter
public class MyConverter implements Converter {
@EJB
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// myService.doSomething
}
}
但是,它没有被注入,并且仍然是null
,这导致了NPE。似乎@PersistenceContext
和@Inject
也不起作用
如何在转换器中注入服务依赖项,以便访问数据库
我可以使用@EJB
将我的服务注入@FacesConverter
不,直到JSF2.3发布。JSF/CDI人员正在为JSF2.3进行这方面的工作。另请参阅我的同事Arjan Tijms的相关文章。只有在将@EJB
、@PersistenceContext
、@Inject
等依赖项注入显式添加到注释时,才能在@facescoverter
中工作
@FacesConverter(value="yourConverter", managed=true)
public class YourConverter implements Converter {
@Inject
private YourService service;
// ...
}
如果不是,那么“正确”的方法是什么 在JSF 2.3之前,您有几个选项:
@ManagedBean
、@Named
或@Component
使其成为JSF、CDI或Spring管理的bean。下面的示例使其成为JSF管理的bean
@ManagedBean
@RequestScoped
public class YourConverter implements Converter {
@EJB
private YourService service;
// ...
}
下面的示例使其成为CDI管理的bean
@Named
@RequestScoped
public class YourConverter implements Converter {
@Inject
private YourService service;
// ...
}
将其引用为
而不是
,或引用为
而不是
。别忘了删除@FacesConverter
注释
缺点是您不能为class指定,因此需要在视图中的任何位置手动定义转换器
@ManagedBean
@RequestScoped
public class YourBean {
@EJB
private YourService service;
// ...
}
在你的转换器中,通过EL抓取或调用它
YourBean yourBean = context.getApplication().evaluateExpressionGet(context, "#{yourBean}", YourBean.class);
// Then e.g. either
YourEntity yourEntity = yourBean.getService().findByStringId(value);
// Or
YourEntity yourEntity = yourBean.findEntityByStringId(value);
这样,您就可以继续使用@FacesConverter
YourService yourService = (YourService) new InitialContext().lookup("java:global/appName/YourService");
缺点是存在一定的风险,即这不是完全可移植的。另见@facescoverter
中透明地添加了对@EJB
(和@Inject
)的支持,无需进一步修改。另见。如果您碰巧需要用于
的转换器,则另一种选择是使用其SelectItemsConverter
,它将根据所选项目自动执行转换作业,而无需任何数据库交互
<h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
另见@FacesConverter(forClass=Product.class)
@Named
@ApplicationScoped
public class ProductConverter implements Converter{
@EJB protected ProductFacade facade;
protected ProductFacade getFacadeFromConverter(FacesContext ctx){
if(facade==null){
facade = ((ProductConverter) ctx.getApplication()
.evaluateExpressionGet(ctx,"#{productConverter}",ProductConverter.class))
.facade;
}
return facade;
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return getFacadeFromConverter(context).find(Long.parseLong(value));
}
...
路易斯·查孔,Sv
工作正常,经过测试
定义EJB:
@Stateless
@LocalBean
public class RubroEJB {
@PersistenceContext(unitName = "xxxxx")
private EntityManager em;
public List<CfgRubroPres> getAllCfgRubroPres(){
List<CfgRubroPres> rubros = null;
Query q = em.createNamedQuery("xxxxxxx");
rubros = q.getResultList();
return rubros;
}
}
从转换器最终访问Ejb对象:
@FacesConverter("cuentaPresConverter")
public class CuentaPresConverter implements Converter {
@EJB
RubroEJB rubroEJB;
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
CuentaPresService service = (CuentaPresService) fc.getExternalContext().getApplicationMap().get("cuentaPresService");
List<CfgCuentaPres> listCuentas=service.getCfgCuentaEJB().getAllCfgCuentaPres();
................
@FacesConverter(“CuentaPreconverter”)
公共类CuentaPresConverter实现转换器{
@EJB
RubroEJB RubroEJB;
公共对象getAsObject(FacesContext fc、uic组件uic、字符串值){
if(value!=null&&value.trim().length()>0){
试一试{
CuentPressService=(CuentPressService)fc.getExternalContext().getApplicationMap().get(“CuentPressService”);
List listCuentas=service.getCFGCOUNTAEJB().getAllCFGCOUNTAPRES();
................
@Inject仅在CDI管理的实例中有效
这只适用于至少JavaEE7和CDI1.1服务器:
@FacesConverter
public class MyConverter implements Converter {
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
myService = CDI.current().select(MyService .class).get();
myService.doSomething();
}
}
UIComponent
检索UISelectItems
,然后迭代此选择项列表并找到值?我的意思是您需要任何注入或向数据库发送请求(如果问题不清楚,我可以用一个示例开始一个新问题)@OuerghiYassine:这个转换器已经存在了:JSF2.3本周发布了!耶!这是怎么回答这个问题的?我猜这可能是这个问题的答案,但是没有解释就很难说。。。
@FacesConverter
public class MyConverter implements Converter {
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
myService = CDI.current().select(MyService .class).get();
myService.doSomething();
}
}