1

重複の可能性:
文字列以外のオブジェクトで呼び出されないPrimefacesselectOneMenuリスナー

私は次Listのように作成しSelectItemています:

List<SelectItem> activityGlobalTypes = new ArrayList<SelectItem>();

for (ActivityTypeXMLModel activityTypeXMLModel : filteredActivityTypeXMLModels) {
    activityGlobalTypes.add(new SelectItem(activityTypeXMLModel, activityTypeXMLModel.getParent()));
}

これはドロップダウンメニューです:

<p:selectOneMenu id="activityGlobalMenu" value="#{adminController.activityDTO.activityParentName}" required="true">
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{adminController.activityGlobalTypes}" />
    <p:ajax listener="#{adminController.updateDependentActivity}" />                        
</p:selectOneMenu>

今メソッドからupdateDependentActivity

public void updateDependentActivity(AjaxBehaviorEvent event) {
    SelectOneMenu menu = (SelectOneMenu) event.getComponent();
    System.out.println(menu.getValue());//it prints com.edfx.adb.xml.model.ActivityTypeXMLModel@7b6fe3c4

    if(menu.getValue() instanceof ActivityTypeXMLModel) {
        System.out.println("value is ActivityTypeXMLModel"); // I was expecting this one
    } else if(menu.getValue() instanceof String) {
        System.out.println("value is String"); //this line is executing 
    } else {
        System.out.println("unknown");
    }   
}

のソースコードを確認しましたSelectItemが、オブジェクト形式で値を保存しています。任意のポインタが非常に役立ちます。

4

2 に答える 2

4

要するに、問題の原因は、非標準のJavaオブジェクト(つまり、no StringNumberまたはBooleanJSFにコンバーターが組み込まれているオブジェクト)がデフォルトStringで単純なObject#toString()呼び出しによって変換されるためです。そのため、複雑なオブジェクトtoString()は、生成されたHTMLでの表現になります<option value>。正確にこの値はサーバーに送信されます。

これはさまざまな方法で解決できます。

  1. との間でConverter変換するカスタムを提供します。これは、とりわけ次の質問に答えられます。文字列以外のオブジェクトで呼び出されないPrimefacesselectOneMenuリスナーActivityTypeXMLModelString

  2. JSFユーティリティライブラリOmniFacesを使用している場合は、提供されているコンバータを使用するomnifaces.SelectItemsConverterか、カスタムコンバータを作成しなくてもomnifaces.SelectItemsIndexConverter、値に基づいて一般的な変換を実行できます。<f:selectItem(s)>

  3. 複雑なJavaオブジェクトタイプをアイテム値として指定しないでください。代わりに、などの標準のJavaオブジェクトタイプを指定してStringください。あなたの場合、あなたはオブジェクトのactivityParentNameプロパティを使いたいようです。ActivityTypeXMLModelJSF2で導入されたvarの属性であるを使用して簡単にトラバージョンするには、値をの代わりに<f:selectItems>変更するだけです。List<ActivityTypeXMLModel>List<SelectItem>

    private List<ActivityTypeXMLModel> activityGlobalTypes;
    

    <f:selectItems value="#{adminController.activityGlobalTypes}" var="type"
        itemValue="#{type.activityParentName}" itemLabel="#{type.parent}" />
    

参照:

于 2013-01-16T13:12:56.940 に答える
0

または文字列ですかadminController.activityDTO.activityParentNameselectItemおそらく、この場合はselectItemである必要があります。

于 2013-01-16T12:07:32.240 に答える