6

一部のクライアントの詳細を表示しているページが 1 つあります。私はt:loopいくつかのデータを表示するために使用しています。でt:loop私はちょうど通り過ぎsourcevalueいます。これまでのところ、私のページはうまく機能しています。しかし、ページを送信しようとすると、突然例外が発生します。

「タイプ java.lang.String からタイプ [addressUsageValue] への強制変換が見つかりませんでした。利用可能な強制変換:………….」</p>

以下はサンプルコードです

<t:loop source="addressUsageInfo" value="addressUsageValue">
                  <tr>
                              <td>${addressUsageValue?.usage}</td>
                              <td>${addressUsageValue?.address}</td>
                              <td>${addressUsageValue?.postCode}</td>
                              <td>${addressUsageValue?.city}</td>
                              <td>${addressUsageValue?.country}</td>
                  </tr>
</t:loop>

私はいくつかのゴーグルを行い、以下の参照を見つけました。

http://tapestry.apache.org/5.3.3/apidocs/org/apache/tapestry5/corelib/components/Loop.html https://issues.apache.org/jira/browse/TAP5-609

それで、ループ用のエンコーダーを作成しました。以下はサンプルコードです。以下のtoClient()メソッドでは、任意の値をランダムに返し、toValue()メソッドでは null を返しています。

private final ValueEncoder<DtoAddressUsageInfo> addressUssageEncoder = 
    new ValueEncoder<DtoAddressUsageInfo>() {

    public String toClient(DtoAddressUsageInfo value) {
          return String.valueOf(value.getUsage());
    }

    public DtoAddressUsageInfo toValue(String clientValue) {
          return null;
    }

};

これで私のコードは正常に動作し、フォームを送信できるようになりました。

ここで私の疑問が生じます

まず、ループを使用するときにエンコーダーが必要な理由を理解できませんか?? フォームを送信する必要がある場合、なぜ必須パラメーターではないのですか??

2 つ目 – ロジックなしで Encoder を実装したところです。toValue() および toClient() メソッドがどこで使用されているのか、またその目的は何なのか理解できません。

3 番目 – ページを送信するときに、なぜフォームにエンコーダーが必要なのですか??

4

2 に答える 2

7

formStateおよびencoderパラメータは、次の問題を解決します。フォームが送信されたときに、フォームからの値が目的のオブジェクトに確実に送られるようにするにはどうすればよいでしょうか。

繰り返し処理しているコレクションがフォームのレンダリングとフォームの送信の間で変わらない場合、最も簡単な解決策は設定することです( docs でformState="iteration"うまく説明されています)。

ただし、レンダリングと送信の間でコレクションが変更される可能性がある場合は、どのループ反復がどのオブジェクトであるかに関する情報をエンコードする必要があります。これは a で行われます(これもドキュメントValueEncoderでうまく説明されています)。一般的な実装では、たとえば、レンダリング時にデータベース ID をフォームにエンコードし ( )、フォームが送信されたときにエンティティをデータベースからロードします ( )。toClient()toValue()

これらはすべて、見つけたLoop コンポーネントのドキュメントにも詳しく説明されています。

于 2012-06-22T08:57:46.863 に答える
2

ヘニングの答えも私を助けました。ループ内の行にチェックボックスを設定しようとした場合にのみ、ループの値が null になります。エンコーダーは動作し、データは正常に表示されます。チェックボックスはセッターで設定され、反復ごと、行ごとにゲッターで取得されます。実際のブール値は、データ オブジェクトのラッパー内に存在します。ループには、これらのラッパー オブジェクトのリストが与えられます。「onClick」イベントがフォームを送信します。しかし、反復ごとに、ラッパー オブジェクト (ループ値) は常に null になります。formstate="iteration" を追加すると、チェックボックスの状態が保持されるようになりました。

<t:loop t:source="treeNodeList" value="treeNode" 
t:encoder="treeNodeEncoder" formState="iteration">
    <tr style="text-align:center;">
        <td class="table-checkbox" id="data-table-1st-col">
        <input t:type="checkbox" value="currentSelectedTreeNode" 
        onclick="this.form.submit();"/>

    ....

        </td>
    </tr>
</t:loop>
于 2013-12-02T15:41:30.260 に答える