我在这里有一个非常基本的设置:
@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
答案 0 :(得分:3)
在当前的1.6.3版本中,@Param(converterClass)
创建了给定转换器类的非托管实例。就像你在没有注射的情况下做new TalentIdConverter()
一样。如果您需要托管实例,那么您应该在此特定情况下使用CDI管理的转换器类(通过@Named
注册)使用@Param(converter)
代替:
@Inject @Param(converter = "#{talentIdConverter}", name = "talentId")
private ParamValue<Talent> curTalent;
或者,如果它已注册为@FacesConverter("talentIdConverter")
,因此在安装OmniFaces 1.6时,JSF管理的转换器类(也只是transparently支持EJB):
@Inject @Param(converter = "talentIdConverter", name = "talentId")
private ParamValue<Talent> curTalent;
或者,如果它已注册为@FacesConverter(forClass=Talent.class)
,则您无需再明确指定转换器。
@Inject @Param(name = "talentId")
private ParamValue<Talent> curTalent;
另一方面,尝试通过BeanManager
为@Param(converterClass)
创建托管实例毕竟不是一个坏主意。我们可能会对未来的OmniFaces版本进行研究。