我尝试在表单中发送请求:
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正确反序列化数组? 谢谢你的帮助
答案 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没有处理好阵列,如果他们没有[]
部分。