2014-03-05 89 views
0

通常我实现我的jsf转换器作为我的例子。但是如果我有10个组件需要转换器,我也需要10个转换器。JSF转换器全局解决方案

问题:给它一个更好的解决方案或一个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> 

回答

1

如果你想有一个genericconverter然后OmnifacesSelectItemsConverter是一切顺利。

Omniface SelectItemConverter

如果你不想使用Omnifaces然后看答案here

+0

这是一个解决方案,我搜索(链接)。非常大的谢谢:) – pL4Gu33

+0

@ pL4Gu33不客气。 – Makky

+1

@ pL4Gu33只是为了让你知道SelectItemsConverter不适用于自动完成.Omnifaces有一个不同的转换器,但有一些问题。所以,为了自动完成,请使用链接中的一个。 – Makky

1

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

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