2014-03-05 88 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