Java selectOneRadio出现JSF转换错误
我有一个简单的JSFWeb应用程序,如下所示。Java类包含:Java selectOneRadio出现JSF转换错误,java,jsf,web-applications,Java,Jsf,Web Applications,我有一个简单的JSFWeb应用程序,如下所示。Java类包含: private String myString; public String getMyString() { return myString; } public void setMyString( String radioValue ) { myString = someHashMap.get( radioValue ); doStuffWith( myString ); } <h:form> <
private String myString;
public String getMyString()
{
return myString;
}
public void setMyString( String radioValue )
{
myString = someHashMap.get( radioValue );
doStuffWith( myString );
}
<h:form>
<h:selectOneRadio id="topicSelectOneRadio" required="true"
requiredMessage="Choose a thing"
value="#{someBean.myString}">
<f:selectItem itemValue="radioValue1" itemLabel="1"/>
<f:selectItem itemValue="radioValue2" itemLabel="2"/>
</h:selectOneRadio>
<p><h:commandButton value="Do it"/></p>
</h:form>
JSF页面源代码包含:
private String myString;
public String getMyString()
{
return myString;
}
public void setMyString( String radioValue )
{
myString = someHashMap.get( radioValue );
doStuffWith( myString );
}
<h:form>
<h:selectOneRadio id="topicSelectOneRadio" required="true"
requiredMessage="Choose a thing"
value="#{someBean.myString}">
<f:selectItem itemValue="radioValue1" itemLabel="1"/>
<f:selectItem itemValue="radioValue2" itemLabel="2"/>
</h:selectOneRadio>
<p><h:commandButton value="Do it"/></p>
</h:form>
及
我不确定我是否理解在哪里需要进行任何形式的“转换”。在这两种情况下,单选按钮中的字符串值被用作setter方法的参数,setter方法将字符串值作为参数。是的,在后一种情况下,它实际上是为不是字符串的东西设置值,但这不重要,对吗?我没有尝试将后一种情况下的radioValueX字符串转换为任何其他类型,只是将其用作hashmap的键,与第一种情况相同
有人能帮我理解我错过了什么吗?谢谢 JSF试图在调用setter之前将
字符串
转换为对象
。由于没有为对象注册转换器,因此会出现此错误
转换在JSF的生命周期阶段3(流程验证)中执行。在第4阶段(更新模型值)中调用setter
您需要添加一个转换器以使其工作:
import javax.faces.convert.Converter;
...
@FacesConverter(“FooConverter”)
公共类FooConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext上下文、UIComponent组件、,
字符串值){
获取(值);
}
@凌驾
公共字符串getAsString(FacesContext上下文、UIComponent、,
对象值){
//从对象转换为字符串
}
}
按以下方式使用转换器:
然后(正如Ian对您的问题的评论中正确指出的那样),您应该更改setter,因为您不再需要在此处进行转换:
public void setMyFoo(Foo newFoo)
{
myFoo = newFoo;
}
JSF试图在调用setter之前将
字符串
转换为对象
。由于没有为对象注册转换器,因此会出现此错误
转换在JSF的生命周期阶段3(流程验证)中执行。在第4阶段(更新模型值)中调用setter
您需要添加一个转换器以使其工作:
import javax.faces.convert.Converter;
...
@FacesConverter(“FooConverter”)
公共类FooConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext上下文、UIComponent组件、,
字符串值){
获取(值);
}
@凌驾
公共字符串getAsString(FacesContext上下文、UIComponent、,
对象值){
//从对象转换为字符串
}
}
按以下方式使用转换器:
然后(正如Ian对您的问题的评论中正确指出的那样),您应该更改setter,因为您不再需要在此处进行转换:
public void setMyFoo(Foo newFoo)
{
myFoo = newFoo;
}
作为旁注,您当前定义的对象打破了“bean”契约。属性
myFoo
是getter暗示的Foo
类型的对象,还是setter暗示的字符串?通常应该避免这种不对称。setter如何暗示它是字符串?setter使用字符串作为参数,但将对象设置为Foo。也就是说,引用的HashMap类型为。。。有件事我忘了提。这是否改变了你的担忧,还是我仍然存在误解?谢谢。通常bean setter应该采用与要设置的字段相同类型的参数。这就是“bean契约”。作为旁注,您当前定义的对象打破了“bean”契约。属性myFoo
是getter暗示的Foo
类型的对象,还是setter暗示的字符串?通常应该避免这种不对称。setter如何暗示它是字符串?setter使用字符串作为参数,但将对象设置为Foo。也就是说,引用的HashMap类型为。。。有件事我忘了提。这是否改变了你的担忧,还是我仍然存在误解?谢谢。通常bean setter应该采用与要设置的字段相同类型的参数。这是“豆合同”,谢谢。但这似乎有点过于复杂。我想知道是否有更简单的方法,比如在我的Foo类中为radio值创建一个额外的“radioValue”属性,然后让setter方法在其中也设置myFoo属性。我想这将做同样的事情作为转换器只是更直接?我以后会和你的版本一起试用。感谢您的解决方案。:-)谢谢但这似乎有点过于复杂。我想知道是否有更简单的方法,比如在我的Foo类中为radio值创建一个额外的“radioValue”属性,然后让setter方法在其中也设置myFoo属性。我想这将做同样的事情作为转换器只是更直接?我以后会和你的版本一起试用。感谢您的解决方案。:-)