4

AutoComplete 演示中 PlayersConverter 的实现实际上不仅用作转换器,还用作玩家列表的加载器。我对这个模型有点厌倦,因为我的项目中已经实现了加载。我不明白为什么 Converter 接口没有作为模板实现:

Converter<Players>

反而。

是的,这些演示看起来很棒,但是看到数据被静态加载到转换器内的列表中,我不知道如何在现实生活中的应用程序中使用它,转换器不应该与数据加载有任何关系。

是否可以在不实际加载数据的情况下使用 PrimeFaces 转换器?如何通知转换器它应该转换的列表项的类型?

4

1 回答 1

4

我了解您所谈论的内容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

于 2013-09-17T16:07:17.280 回答