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>

私が理解しているように、web ページの radioValueX 文字列は、myString セッター メソッドへのパラメーターとして Java クラスで使用されています。したがって、任意のクラスを使用できるように、さらに一歩拡張したいと考えました。

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 String を他のタイプに変換しようとしているのではなく、ハッシュマップのキーとして使用するだけです。

私が欠けているものを理解するのを手伝ってくれる人はいますか? ありがとう!

4

1 に答える 1

4

JSF は、setter が呼び出される前にStringtoを変換しようとします。オブジェクトにコンバーターが登録されていないため、このエラーが発生します。Object

変換は、JSF のライフサイクル フェーズ 3 (PROCESS VALIDATIONS) で実行されます。セッターは、フェーズ 4 (UPDATE MODEL VALUES) で呼び出されます。

それを機能させるには、コンバーターを追加する必要があります。

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 に答える