Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java selectOneRadio出现JSF转换错误_Java_Jsf_Web Applications - Fatal编程技术网

Java selectOneRadio出现JSF转换错误

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> <

我有一个简单的JSFWeb应用程序,如下所示。Java类包含:

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属性。我想这将做同样的事情作为转换器只是更直接?我以后会和你的版本一起试用。感谢您的解决方案。:-)