我有這個f:viewParam
,我嘗試綁定驗證,並轉換成userId
Player
,我得到了一個意想不到的結果。F:viewParam與轉換器和ViewScoped例外出來的時候調用第二Ajax請求
<f:metadata>
<f:viewParam name="userId" value="#{myBean.selectedPlayer}" converter="pConverter"
converterMessage="Bad Request. Unknown User" required="true"
requiredMessage="Bad Request. Please use a link from within the system" />
</f:metadata>
<h:body>
<p:messages id="msgs"/>
<h:form>
<ul>
<li><a href="index2.xhtml?userId=1">Harry</a></li>
<li><a href="index2.xhtml?userId=2">Tom</a></li>
<li><a href="index2.xhtml?userId=3">Peter</a></li>
</ul>
</h:form>
<h:form>
<h:panelGrid columns="2" rendered="#{not empty myBean.selectedPlayer}">
<h:outputText value="Id: #{myBean.selectedPlayer.id}"/>
<h:outputText value="Name: #{myBean.selectedPlayer.name}"/>
</h:panelGrid>
</h:form>
<h:form id="testForm">
<h:inputText value="#{myBean.text}"/>
<p:commandButton value="Switch" update=":msgs testForm"/>
<h:outputText value="#{myBean.text}" rendered="#{not empty myBean.text}"/>
</h:form>
</h:body>
我轉換這個樣子的
@FacesConverter(value="pConverter")
public class PConverter implements Converter {
private static final List<Player> playerList;
static{
playerList = new ArrayList<Player>();
playerList.add(new Player(1, "Harry"));
playerList.add(new Player(2, "Tom"));
playerList.add(new Player(3, "Peter"));
}
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value == null || !value.matches("\\d+")){
return null;
}
long id = Long.parseLong(value);
for(Player p : playerList){
if(p.getId() == id){
return p;
}
}
throw new ConverterException(new FacesMessage("Unknown userId: " + value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object value) {
if(!(value instanceof Player) || value == null){
return null;
}
return String.valueOf(((Player)value).getId());
}
}
當我點擊三個連桿(哈利,湯姆,彼得),轉換器的工作很大。它轉換ID並將player
綁定回我的託管bean。然後我在文本框中輸入東西,然後點擊Switch
,第一次工作正常,我鍵入的內容出現在按鈕旁邊,但是然後我改變我輸入的內容,然後再次點擊Switch
,然後出現錯誤信息Bad Request. Please use a link from within the system
,這是required
的錯誤消息爲f:viewParam
。如果我把f:viewParam取出,那麼一切正常。令人驚訝的是,如果我從f:viewParam切換到o:viewParam(OmniFaces),那麼它很好用。
非常感謝。 Omnifaces非常棒,BalusC。我有一個關於'o:viewParam'的問題,在你的博客中,你說omnifaces每次調用一個Ajax請求時都會避免調用'Converter',但是,它總是在getAsString()方法內部。所以我想知道這種行爲是否正確。我知道'getAsObject'是設置模型的值,所以不要調用'getAsObject'是一個很大的改進。我爲此感謝你。 –
當對象需要轉換爲字符串(以呈現在生成的HTML中)時,將調用'getAsString()'。但它應該是一個相當便宜的工作,因爲它應該是其中一個屬性的字符串值。你已經掌握了這個對象,所以不需要昂貴的數據庫工作。 – BalusC
非常感謝。 –