7

Struts 2 (JDK 1.7、Struts 2.2.1) アプリケーションを使用しています。このアプリケーションには、フィルター条件のリストが含まれており、文字列としてマップに格納されています。

Map< String, String > m_filters = new HashMap< String, String >();

public Map< String, String > getFilters() {
    return m_filters;
}

次のような形式の URL を渡します。

http://myserver.com/myapp/GenerateReport.action?reportID=Whatever&filters.fromDate=0&filters.toDate=2000000000&filters.FcsType=piv_cardholder_3kp&detailed=true

マップには文字列として指定されたキーと値の両方の型がありますが、これから値を取得しようとしています

    Map< String, String > filters = getFilters();
    String value = filters.get( "fromDate" );

この例外がスローされます。

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String

単体テストでこれを再現し、Struts 2 が各パラメーターの String ではなく String[1] を作成しているように見えることをデバッガーで確認しました。つまり、長さ 1 の文字列配列であり、文字列のみが期待値 (この場合は "0") です。

私の質問は次のとおりです。これは Struts2 のバグですか、それとも間違ったことをしていますか?

バグの場合、既知の回避策はありますか?

4

4 に答える 4

8

Java Bean の規則に従えば問題はありません。

この問題を解決するためのガイドラインを次に示します。

  • この問題は、プライベート メンバーに「filter」という名前を付け、filter に getter のみを指定した場合には発生しません。
  • ゲッターに加えてパブリック セッターを提供する場合 (m_filter などのプライベート メンバーに別の名前を使用する場合でも)、この問題は発生しません。
  • この問題は、setter を指定せず、プロパティが getter と同じ名前でない場合にのみ発生します。

長い話は短い慣習に従います。上記の動作は Struts 2.3.4 でテスト済み

私が推測しているのは、ゲッターでも設定が可能です(セッターしかない場合、マップに1つのアイテムしか設定できませんでしたが、現在のパラメーターインターセプターではこれが当てはまります)。Bean は、プロパティがどのように型変換を行うべきかを確認するために検査され、おそらく最初に、その名前のプロパティのアクションを調べて、デフォルトを使用する必要がある型を判断することに失敗したセッターを探します。デフォルトのパラメータ タイプは String から String[] へのマッピングであり、これが表示されているものです。

于 2012-11-29T03:47:22.697 に答える
4

間違った表記法を使用しています。filters.fromDateと同等になりますがgetFilters().setFromDate()、これは実際には必要なものではありません。ドット表記は JavaBeans 用です。

などの括弧を使用してみてくださいfilters['fromDate']

http://struts.apache.org/2.2.1/docs/type-conversion.html#TypeConversion-RelationshiptoParameterNamesを参照してください。

于 2012-11-28T20:37:50.633 に答える
0

これを試して:

 Object[] obj = (Object[]) filters.get( "fromDate" );
 String value = (String)obj[0]);
于 2012-11-28T19:14:10.280 に答える
0

これは、機能と見なすことができるバグではありません。RequestParameters へのアクセス

ParameterAware インターセプター

/http://localhost:8080/myApp/login.action?name=struts2&name=rocks とします。

名前パラメータ string[0] = struts2、string 1 =rocksにアクセスしようとすると

于 2012-11-28T19:16:42.977 に答える