4

我在这里有一个非常基本的设置:

@Named
@ApplicationScoped
public class TalentIdConverter implements Converter {
    @EJB
    private EntityManagerDao em;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (Strings.isNullOrEmpty(value)) {
            return null;
        }
        return em.find(Talent.class, Long.parseLong(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((Talent) value).getId());
    }
}

// Manager.class
public class Manager {
    @Inject @Param(converterClass = TalentIdConverter.class, name = "talentId")
    private ParamValue<Talent> curTalent

    @PostConstruct
    public void init() {
        // use curTalent.getValue()
    }
}

但是每次TalentIdConverter.getAsObject调用em都是空的。有人能告诉我这是为什么吗?我也试过@FacesConverter在转换器上使用,但行为没有改变。

这是在 Wildfly-8.0.0.Beta1 上使用 Weld-2.1.0.CR1 和 Omnifaces-1.6.3

4

1 回答 1

3

在当前的 1.6.3 版本中,@Param(converterClass)创建给定转换器类的非托管实例。就好像你new TalentIdConverter()没有任何注射一样。如果您需要托管实例,那么在这种特定情况下,您应该使用 CDI 托管转换器类(通过 注册@Named)来@Param(converter)代替:

@Inject @Param(converter = "#{talentIdConverter}", name = "talentId")
private ParamValue<Talent> curTalent;

或者,如果它被注册为@FacesConverter("talentIdConverter")一个 JSF 管理的转换器类(当您安装了 OmniFaces 1.6 时,它也只是透明地支持 EJB):

@Inject @Param(converter = "talentIdConverter", name = "talentId")
private ParamValue<Talent> curTalent;

或者,如果它被注册为@FacesConverter(forClass=Talent.class),那么您不再需要显式指定转换器。

@Inject @Param(name = "talentId")
private ParamValue<Talent> curTalent;

另一方面,尝试通过BeanManagerfor创建托管实例@Param(converterClass)毕竟不是一个坏主意。我们可能会在未来的 OmniFaces 版本中对此进行研究。

于 2013-11-11T16:42:33.687 回答