1

オブジェクトのリストから一連のラジオボタンを作成し#{item.items3}、選択したオブジェクトを に保存したいと考えています#{cartBean.selectedChoice}<f:selectItems>とに必要な値の違いがわかりません<ui:repeat>。私のコードはどのように見えますか。これまでに明らかな間違いはありますか?

<p:selectOneRadio id="myRadio" value="#{cartBean.selectedChoice}" layout="custom">
    <f:selectItems value="#{item.items3}"/>
</p:selectOneRadio>

<h:panelGrid columns="1">
    <ui:repeat var="choice" value="#{item.items3}" varStatus="choiceIndex">
        <p:radioButton id="choiceRadio" for=":iterateCategories:iterateItems:lightForm:myRadio" itemIndex="#{choiceIndex.index}" />#{choice.name}
    </ui:repeat>
</h:panelGrid>

現時点では、次のエラーが発生しています。

20:58:52,397 INFO [javax.enterprise.resource.webcontainer.jsf.renderkit] (http-localhost-127.0.0.1-8080-1) 警告: FacesMessage はキューに入れられましたが、表示されていない可能性があります。sourceId=iterateCategories:0:iterateItems:2:lightForm:myRadio[severity=(ERROR 2), summary=(変換エラー設定値 'huhu.model.generated.Item@3ae5e1dc' for 'null Converter'.), detail=( 'null コンバーター' の変換エラー設定値 'huhu.model.generated.Item@3ae5e1dc'.)]

同じクラスのオブジェクトのみが処理されるため、変換の問題が発生する可能性がある場所がわかりません。

4

1 に答える 1

2

JSFはHTMLを生成します。HTMLは基本的に1つの大きな文字列です。したがって、文字列型ではないJavaオブジェクトは文字列に変換する必要があります。組み込みのコンバーター(、、および)もカスタムコンバーター(実装するクラス)も見つからないタイプがNumber見つかっBooleanEnum場合Converter、オブジェクトのデフォルトのtoString()実装を使用して、複雑なJavaオブジェクトをHTML出力に出力します。オブジェクトでこのメソッドがオーバーライドされていない場合は、 javadocObject#toString()で説明されているデフォルトの実装になります。

クラスのtoStringメソッドは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字、およびオブジェクトのハッシュコードの符号なし16進表現でObject構成される文字列を返します。@つまり、このメソッドは次の値に等しい文字列を返します。

getClass().getName() + '@' + Integer.toHexString(hashCode())

特定のケースでは、生成されたHTMLラジオボタン要素は次のようになります。

<input type="radio" ... value="huhu.model.generated.Item@3ae5e1dc" />

(ブラウザでページを右クリックし、[ソースの表示]を選択して自分で表示します)

ここで、このフォームが送信されると、huhu.model.generated.Item@3ae5e1dcによって収集されたrequest.getParameter()(!を返すString)入力値そのものを、カスタムタイプの具体的なインスタンスに変換し直す必要がありますItem。ただし、カスタムタイプにコンバーターが登録されていないようであるため(エラーメッセージはすでに「nullコンバーター」を示​​唆しています)、JSFはそれを元に戻すことができず、Itemこのコンバーター例外をスローします。

Itemとその固有のString表現の間で適切に変換するカスタムコンバーターを実際に提供する必要があります。多くの場合、技術ID(データベースから自動生成されたPKなど)が一意のString表現として使用されます。コンバーターは次のようになります。

@FacesConverter(forClass=Item.class)
public class ItemConverter implements Converter {

    @Override
    public void getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {
        // Write code to convert Item to its unique String representation. E.g.
        return String.valueOf(((Item) modelValue).getId());
    }

    @Override 
    public void getAsObject(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
        // Write code to convert unique String representation of Item to concrete Item. E.g.
        return someItemService.find(Long.valueOf(submittedValue));
    }
    
}

または、SelectItemsConverterJSFユーティリティライブラリOmniFacesを使用して、コンバータが代わりに<f:selectItem(s)>変換ベースとして使用するようにすることもできます。このように、で使用するすべてのカスタムJavaタイプに対してカスタムコンバータを作成する必要はありません<f:selectItem(s)>ショーケースページも参照してSelectItemsConverterください。

<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter">
于 2012-10-29T21:07:46.677 に答える