私のアプリケーションでは、都市 (A) と郵便番号 (B) の間に関係があります。
だから私は2つの SelectOneMenu を持っています.1つ目はAを表し、2つ目は選択されたAのBを表し、これらはajax経由で更新されます。
私はこれらの 2 つのメニューを複数回使用しているため、セッション Bean の既存の変数に A 値と B 値が割り当てられている限り、通常は正常に機能するカスタム タグを作成しました。
しかし、タグ コンポーネントを使用して動作していない Bean に新しい関係オブジェクトを渡したい場合があります。
ロジック セッション Bean の add メソッドに引数として渡したい新しいリクエスト スコープの AToB オブジェクトのプロパティ A と B が null です。
*追記事項
- 既存のセッション Bean 変数でタグ コンポーネントを使用すると機能します。
- タグ コンポーネントを使用して新しいリクエスト Bean ベースの関係オブジェクトを追加しても機能しません。
- 選択された A は常に (ケース 1 と 2 の場合) ajax 変更イベントを使用して正しく Bean に渡されます。
- SelectOneMenu のコンバーターは常に機能します。(デバッグモードでテスト済み)
- タグ コンポーネントを使用すると、JSF はセッターを呼び出して新しい AToB オブジェクトの A と B を設定し、デバッグ モードでテストされることはありません。
- primefaces の代わりに jsf default h:commandButton を使用すると、同じエラーが発生します。
- タグ コンポーネントを使用しなくても完全に機能します。
環境:
モハラ 2.14 グラスフィッシュ
3.01
コンストラクターとゲッターとセッターを削除してクラスを簡素化しました。
DTO、ポジョ:
public Class A{}
public Class B{}
public Class AToB
{
private A a;
private B b;
}
セッション Bean:
public Class Bean
{
private List<A> as;
private List<B> bs;
private AConverter aConverter;
private BConverter bConverter;
//updates bs list
public void updateBsByA(AjaxBehaviorEvent event) {}
//does something with the given AToB
public void add(AToB aToB)
}
顔-config.xml:
<managed-bean>
<managed-bean-name>beanLogic</managed-bean-name>
<managed-bean-class>package.Bean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>new AToB Object I want to add at database</description>
<managed-bean-name>newAToB</managed-bean-name>
<managed-bean-class>package.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
abSelect タグ ファイル:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:abcd="http://store24.de/jsf/admin">
<h:selectOneMenu value="#{tagA}" converter="#{beanLogic.aConverter}">
<f:selectItems value="#{beanLogic.as}"/>
<p:ajax event="change" listener="#{beanLogic.updateBsByA}" update="selectB"/>
</h:selectOneMenu>
<h:selectOneMenu id="selectB" value="#{tagB}" converter="#{beanLogic.bConverter}">
<f:selectItems value="#{beanLogic.bs}"/>
</h:selectOneMenu>
</ui:composition>
abcd.taglib.xml
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://abcd.com/jsf</namespace>
<tag>
<tag-name>abSelect</tag-name>
<source>tags/abSelect.xhtml</source>
<attribute>
<display-name>a</display-name>
<name>tagA</name>
<required>true</required>
<type>package.A</type>
</attribute>
<attribute>
<display-name>a</display-name>
<name>tagB</name>
<required>true</required>
<type>package.B</type>
</attribute>
</tag>
</facelet-taglib>
呼び出しサイト:
<abcd:abSelect a="#{newAToB.a} b="#{newAToB.b}"/>
<p:commandButton value="add" action="#{beanLogic.add(newAToB)}"/>
代わりに、タグ コンポーネントなしで新しい AToB を追加すると機能します (上記 #2 を参照)。
<h:selectOneMenu value="#{newAToB.a}" converter="#{beanLogic.aConverter}">
<f:selectItems value="#{beanLogic.as}"/>
<p:ajax event="change" listener="#{beanLogic.updateBsByA}" update="selectB"/>
</h:selectOneMenu>
<h:selectOneMenu id="selectB" value="#{newAToB.b}" converter="#{beanLogic.bConverter}">
<f:selectItems value="#{beanLogic.bs}"/>
</h:selectOneMenu>
<p:commandButton value="add" action="#{beanLogic.add(newAToB)}"/>