猿问

如何在@Faces转换器中注入@EJB、@PersistenceContext、@Injection

如何在@Faces转换器中注入@EJB、@PersistenceContext、@Injection、@Autored等?

我怎样才能注入类似的依赖项@EJB@PersistenceContext@Inject@AutoWired,在.中.@FacesConverter?在我的特定情况下,我需要通过@EJB:

@FacesConverterpublic class MyConverter implements Converter {

  @EJB
  protected MyService myService;    

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    // myService.doSomething
  }}

然而,它没有被注射,它仍然null,导致NPEs。看来@PersistenceContext@Inject也不管用。

如何在转换器中注入服务依赖项,以便访问DB?


隔江千里
浏览 475回答 3
3回答

倚天杖

您可以通过FacesContext间接访问它,这是两个转换器方法中的一个参数。转换器也可以用应用程序范围命名为CDI注解。在访问Facade时,将使用同一个类的两个实例。一个是转换器实例本身,哑巴,不知道EJB注释。另一个实例保留在应用程序范围内,可以通过FacesContext访问。该实例是一个命名对象,因此它知道EJB注释。由于所有操作都是在一个类中完成的,所以可以保护访问。请参见以下示例:@FacesConverter(forClass=Product.class)@Named@ApplicationScopedpublic 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));     }...
随时随地看视频慕课网APP

相关分类

Java
JavaScript
我要回答