与PrimeFaces转换器混淆(适用于selectOneMenu)

时间:2013-09-15 23:28:29

标签: jsf primefaces

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

Converter<Players>

代替。

是的,这些演示看起来很棒,但是看到数据被静态加载到转换器内的列表中,我无法想象如何在现实应用中使用它,转换器不应该与数据加载有任何关系。 / p>

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

1 个答案:

答案 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

的组件,有一个类似的转换器