2

フォームでリクエストを送信しようとしています:

list=Apple1&list=Apple2&list=Apple3 

一方、AppleはJSONでシリアル化される複雑なオブジェクトです。

 {"param1":"value1", "param2":"value2"}

このようなリクエストを受信するために、SpringでDispatcherサーブレットを次のようなメソッドで定義しました。

request(@RequestParam("list") POJO[] pojos){
//handle request
}

単一のPOJOを次のようなメソッドに送信することは問題ありません

request(@RequestParam("single") POJO pojos){
//handle request
}

しかし、配列を送信しようとするとすぐに、Springは次のような例外で死にます。

java.lang.NoSuchMethodException: [Lmy.package.Apple;.<init>()

配列を正しく逆シリアル化するようにディスパッチャサーブレットに教えるにはどうすればよいですか?助けてくれてありがとう

4

2 に答える 2

2

ディスパッチャサーブレット自体ではなく、ディスパッチャサーブレットが実装するインターフェイスに@RequestParamアノテーションを追加したときに、このエラーが発生しました。この場合、Springはアノテーションを無視し、リンゴの配列を直接インスタンス化しようとします。これにより、指定したエラーメッセージが表示されますjava.lang.NoSuchMethodException: [Lmy.package.Apple;.<init>()

于 2012-09-24T13:07:58.963 に答える
1

あなたが得る例外は、あなたのアプリAppleが引数なしのコンストラクターを持つことを期待し、それを見つけることができないことを意味します( Oracleのトラブルシューティングページの後):

引数なしのコンストラクターが要求され、引数を渡そうとしたため、IllegalArgumentException がスローされます。コンストラクターに間違った型の引数が渡された場合、同じ例外がスローされます。

$ java ConstructorTroubleAgain int
java.lang.NoSuchMethodException: ConstructorTroubleAgain.<init>(int)
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at ConstructorTroubleAgain.main(ConstructorTroubleAgain.java:26)

それは…何でも意味することができます。JSON文字列からAppleへのJacksonのデシリアライズはうまくいきますか? Apple オブジェクトはどのように作成されますか? Apple1適切にエスケープされた文字列ですか? また、試してみることができますか

list[]=Apple1&list[]=Apple2&list[]=Apple3

request(@RequestParam("list[]") Apple[] apples)

前回、Spring が部分を持たない配列をうまく処理できないことを発見したため[]です。

于 2012-09-18T18:50:20.640 に答える