JSF转换器全局解决方案

时间:2014-03-05 16:26:27

标签: java jsf-2 primefaces converter

Normaly我实现了我的jsf转换器作为我的例子。但如果我有10个需要转换器的组件,我也需要10个转换器。

问题:为jsf转换器提供更好的解决方案或全局解决方案,以便不是每个组件都需要自己的转换器?

转换器:

@FacesConverter(value="PersonConverter")
public class PersonConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
    if(value != null){
        MyBean bean = (MyBean)FacesContext.getCurrentInstance().getViewRoot().getViewMap().get("myBean");
        for(Person p : bean.getSearchedPersons()){
            if(p.getName().equals(value)){  

                return p;
            }
        }
    }
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    if(value != null && value instanceof Person){
        return ((Person)value).getName();
    }
    return null;
}
}

豆:

@ViewScoped
@ManagedBean
public class MyBean {

@EJB
private PersonService service;

private List<Person> searchedPersons;

private Person selectedPerson;

public void printSelectedPerson(ActionEvent event) {

        System.out.println("Selected Person: "
                + selectedPerson.getName());

}

public List<Person> searchValues(String str) {
    searchedPersons = service.searchPerson(str);
    return searchedPersons;
}

/** GETTER & SETTER */

XHTML:

<h:form id="mainform">
        <p:autoComplete completeMethod="#{myBean.searchValues}" value="#{myBean.selectedPerson}"
        converter="PersonConverter" var="p" itemLabel="#{p.name}" itemValue="#{p}" forceSelection="true"/>          
        <p:commandButton value="Test" actionListener="#{myBean.printSelectedPerson}"/>          
    <p:messages globalOnly="false" autoUpdate="true"/>
</h:form>

2 个答案:

答案 0 :(得分:2)

如果您希望在任何地方使用该转换器以获得Person类型的值,则可以使用@FacesConverter(forClass=Person.class)。看here

..., whenever that class is specified by a value attribute of an input component, the converter is invoked automatically

答案 1 :(得分:1)

如果您想要generic converter,那么Omnifaces SelectItemsConverter就是最好的。

Omniface SelectItemConverter

如果您不想使用Omnifaces,请查看答案here