1
在我的JSF pagecode,我有類似下面的內容:H:selectOneRadio正在通過空字符,而不是空值的
<h:selectOneRadio value="#{pagecode.attending}" required="true" id="attendingRadio" binding="#{attendingRadio}">
<f:selectItem itemValue="Y" itemLabel="Yes"/>
<f:selectItem itemValue="N" itemLabel="No"/>
<f:ajax event="click" render="attendingDetails" execute="attendingRadio"/>
</h:selectOneRadio>
<h:panelGroup id="attendingDetails">
<h:panelGroup rendered="#{pagecode.showForm(attendingRadio.value)}">
...
</h:panelGroup>
</h:panelGroup>
在我pagecode支持bean,我有類似如下:
public class Pagecode {
protected Character attending;
public Character getAttending() {
return attending;
}
public void setAttending(Character attending) {
this.attending=attending;
}
public boolean showForm(Character c) {
if (c==null) {
return false;
}
(other stuff)...
}
}
我期望的行爲是:
- 頁面加載。單選按鈕沒有被定義爲初始值,因此既不選擇也不選擇。但是,因爲required =「true」,所以如果用戶將它留空(並且它們爲空),用戶將得到驗證錯誤。
- 第一次加載頁面時,#{pagecode.showForm(attendingRadio.value)}被調用,我期望一個空對象將被傳遞,showForm將返回false。
做一些故障排除之後,我決定什麼是實際發生的是不是空對象的傳遞,即等價showForm(null)
,我不是得到的showForm(new Character('\u0000'))
相當於;它會傳遞null的Unicode字符。
當我的h:selectOneRadio沒有選擇一個值時,有沒有辦法讓JSF傳遞Java空對象而不是空字符?我在WebSphere Portal 8.0上使用Apache MyFaces JSF 2.0。
作爲一個方面說明,我曾嘗試下面的添加到我的web.xml,而且不幸的是沒有幫助:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
雖然我不同意,這是不幸的是沒有什麼事情我可以在這個項目很容易地改變 - 我所提供的代碼示例是一種簡化。實際參與的字符不在主頁面編碼類中,而在另一個屬於該子類屬性的對象內,不幸的是,該類是其他幾個項目使用的共享庫的一部分。我想改變它,但目前,我不能。 即使只是好奇的緣故,有沒有辦法讓h:selectOneRadio發送null而不是空字符?看起來像一個奇怪的實現。 – Chatoyancy
責備EL,而不是JSF。您可以嘗試禁用COERCE_TO_ZERO。相關:http://balusc.omnifaces.org/2015/10/the-empty-string-madness.html – BalusC
我剛剛用COERCE_TO_ZERO參數進行了測試,可以驗證它是否修復了它。行爲與該問題有關。謝謝! – Chatoyancy