1

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

private String myString;

public String getMyString()
{
  return myString;
}

public void setMyString( String radioValue )
{
  myString = someHashMap.get( radioValue );
  doStuffWith( myString );
}

JSF 页面源包含:

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

据我了解,网页中的 radioValueX 字符串在 Java 类中用作 myString setter 方法的参数。所以我想进一步扩展它以使用任何类:

private Foo myFoo;

public Foo getMyFoo()
{
  return myFoo;
}

public void setMyFoo( String radioValue )
{
  myFoo = someHashMap.get( radioValue );
  doStuffWith( myFoo );
}

<h:form>
 <h:selectOneRadio id="topicSelectOneRadio" required="true"
    requiredMessage="Choose a thing"
    value="#{someBean.myFoo}">
    <f:selectItem itemValue="radioValue1" itemLabel="1"/>
    <f:selectItem itemValue="radioValue2" itemLabel="2"/>
 </h:selectOneRadio>
 <p><h:commandButton value="Do it"/></p>
</h:form>

但是,我收到以下错误:

Conversion Error setting value 'radioValue' for 'null Converter'.

我不确定我是否了解需要在哪里进行任何类型的“转换”。在这两种情况下,单选按钮中的字符串值都被用作 setter 方法的参数,该方法将字符串值作为参数。没错,在后一种情况下,它实际上是在为不是字符串的东西设置值,但这不重要,不是吗?我不想将后一种情况下的 radioValueX 字符串转换为任何其他类型,只是将其用作哈希图的键,与第一种情况相同。

任何人都可以帮助我了解我所缺少的吗?谢谢!

4

1 回答 1

4

JSF 在调用 setter之前尝试将您转换String为。而且由于您没有为您的对象注册转换器,因此您会收到此错误。Object

转换在 JSF 的生命周期阶段 3(过程验证)中执行。在第 4 阶段(更新模型值)调用设置器。

您需要添加一个转换器才能使其工作:

import javax.faces.convert.Converter;
...
@FacesConverter("FooConverter")
public class FooConverter implements Converter{
  @Override
  public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
    someHashMap.get(value);
  }
  @Override
  public String getAsString(FacesContext context, UIComponent component,
            Object value) {
    // convert from Object to String
   }    
}

以这种方式使用转换器:

<h:selectOneRadio id="topicSelectOneRadio" required="true"
    requiredMessage="Choose a thing"
    value="#{someBean.myFoo}">
    <f:converter converterId="FooConverter"/>
    <f:selectItem itemValue="radioValue1" itemLabel="1"/>
    <f:selectItem itemValue="radioValue2" itemLabel="2"/>
</h:selectOneRadio>

然后(正如伊恩对您问题的评论中正确说明的那样)您应该更改您的设置器,因为您不再需要在这里进行转换:

public void setMyFoo(Foo newFoo)
{
  myFoo = newFoo;
}
于 2012-04-06T18:40:24.667 回答