我了解您所谈论的内容PlayerConverter
如本页所示。这只是为了纯粹的演示目的而进行的极其本地化的实现(展示不使用任何数据库,他们必须在某处获取这些数据)。这确实令人困惑和误导。在现实世界的代码中,您应该与数据库中的数据进行交互,如下所示:
@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"中的“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
无法使用。另请参阅如何在 @FacesConverter 中注入 @EJB、@PersistenceContext、@Inject、@Autowired 等?
与具体问题无关,我知道整个转换器似乎是某种不必要的代码重复。JSF 实用程序库 OmniFaces 以omnifaces.ListConverter
. 只需使用converter="omnifaces.ListConverter"
而不是converter="player"
和整个转换器类。请注意,对于使用<f:selectItem(s)>
、 的组件,有一个类似的转换器omnifaces.SelectItemsConverter
。