为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

隔江千里 2019-07-11 10:31:11
如何在@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?
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超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));
    }...


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 474 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信