AutoComplete演示中PlayersConverter的实现实际上不仅用作转换器,还用作播放器列表的加载器。我对这个模型感到有些厌倦,因为我的项目已经实现了加载。 我不明白为什么Converter接口没有实现为模板:
Converter<Players>
代替。
是的,这些演示看起来很棒,但是看到数据被静态加载到转换器内的列表中,我无法想象如何在现实应用中使用它,转换器不应该与数据加载有任何关系。 / p>
是否可以使用PrimeFaces转换器而不实际加载数据?如何通知转换器它应该转换的列表项类型?
答案 0 :(得分:3)
我知道您正在谈论PlayerConverter
,如this page所示。这只是一个非常本地化的实现,用于纯粹的演示目的(展示不使用任何数据库,他们必须掌握这些数据某处)。这确实令人困惑和误导。在现实世界的代码中,您应该与数据库中的数据进行交互,如下所示:
@ManagedBean
public class PlayerConverter implements Converter {
@EJB
private PlayerService service;
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
if (submittedValue == null || submittedValue.isEmpty()) {
return null;
}
try {
return service.find(Integer.valueOf(submittedValue));
} catch (NumberFormatException exception) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid player ID"));
}
}
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
if (modelValue == null) {
return "";
}
if (modelValue instanceof Player) {
return String.valueOf(((Player) modelValue).getNumber());
} else {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid player instance"));
}
}
}
编辑前的原始问题:
此外,当他们在演示中写下 converter =“player” “播放器”指的是什么?
关于converter="player"
,它只是在<converter-id>
中注册的faces-config.xml
的值。您也可以通过@FacesConverter
注释注册它:
@FacesConverter("player") // I'd rather rename it to playerConverter.
public class PlayerConverter implements Converter {
// ...
}
请注意,我的示例使用的是@ManagedBean
,否则无法使用@EJB
。另请参阅How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter?
无关到具体问题,我明白整个转换器似乎是某种不必要的代码重复。 JSF实用程序库OmniFaces已经确定并解决了omnifaces.ListConverter
的问题。只需使用converter="omnifaces.ListConverter"
代替converter="player"
和整个转换器类。请注意,对于使用<f:selectItem(s)>
omnifaces.SelectItemsConverter
。