将POJO数组绑定为请求参数

时间:2012-09-18 15:55:16

标签: java spring-mvc

我尝试在表单中发送请求:

list=Apple1&list=Apple2&list=Apple3 

而Apple是一个复杂的对象,用JSON序列化:

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

我在Spring中定义了一个Dispatcher Servlet来接收这样的请求,方法如下:

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

将单个POJO发送到像

这样的方法是没有问题的
request(@RequestParam("single") POJO pojos){
//handle request
}

但是一旦我尝试传输一个阵列,Spring就会死于一个例外情况:

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

如何教导调度程序servlet正确反序列化数组? 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

当我将@RequestParam注释添加到我的调度程序servlet实现的接口而不是调度程序servlet本身时,我遇到了这个错误。在这种情况下,Spring会忽略注释并尝试直接实例化苹果数组,这会导致您提供的错误消息:java.lang.NoSuchMethodException: [Lmy.package.Apple;.<init>()

答案 1 :(得分:1)

你得到的例外意味着你的应用程序希望Apple拥有no-arg构造函数并且找不到它(Oracle's Troubleshooting page之后):

  

抛出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是否运作良好?你的Apple对象是如何创建的? Apple1是否正确转义了字符串?你也可以试试

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

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

因为上次我发现Spring没有处理好阵列,如果他们没有[]部分。