Caused by: javax.faces.convert.ConverterException: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:91)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:630)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.encodeEnd(HtmlRadioRendererBase.java:91)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
... 110 more
Caused by: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:87)
... 113 more
后來在國外網(wǎng)站上面找到了問題所在:
Hello,
the problem still exists in MyFaces Core 1.2.6.
I have a selectOneMenu with a value binding to a boolean property.
In the boolean converter the ClassCastException still occurs.
...
Caused by: javax.faces.convert.ConverterException: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:91)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:630)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.encodeEnd(HtmlRadioRendererBase.java:91)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:624)
... 110 more
Caused by: java.lang.ClassCastException: org.apache.myfaces.shared_impl.renderkit.RendererUtils$1
cannot be cast to java.lang.Boolean
at javax.faces.convert.BooleanConverter.getAsString(BooleanConverter.java:87)
... 113 more
In RendererUtils there are some tests that value equals NOTHING. However the equals method
of the NOTHING-Serializable isn't overriden. Therefore it has no effect.
Overriding the equals method as in the patch of paul works.
有些東西沒有實現(xiàn),導(dǎo)致了這個問題。這個可能需要你自己簡單實現(xiàn)一下源文件然后編譯成庫文件了,感覺麻煩就換成了SelectOneMenu了。
后面有時間再看了
public UIComponent findComponent(String name) {
// 不能使用靜態(tài)變量view保持當(dāng)前的viewroot,因為每次操作之后的viewroot都是不一樣的
ViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
return view.findComponent(name);
}
需要注意的是 不能使用靜態(tài)變量view保持當(dāng)前的viewroot,因為每次操作之后的viewroot都是不一樣的。
對比以上兩種方法,第一種簡單方便,但只適合于取值操作。第二種可操控的范圍和能力更大,不僅可以取值還可以設(shè)置和獲得所有屬性。
<h:form target="mainFrame"> |
mainFrame |
<h:form target="mainFrame"> |
mainFrame |
這個事件是為了捕捉一些階段和過程而設(shè)定的,有以下幾個階段可以捕捉:
具體可以參考http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseId.html
通過設(shè)定在實現(xiàn)類中設(shè)定相應(yīng)的PhaseId以及添加到faces-config.xml中就可以捕捉相應(yīng)階段事件并添加響應(yīng)的代碼
實現(xiàn)類