2

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

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 正确反序列化数组?谢谢你的帮助

4

2 回答 2

2

当我将 @RequestParam 注释添加到我的调度程序 servlet 实现的接口时,我遇到了这个错误,而不是调度程序 servlet 本身。在这种情况下,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)

这可能意味着......任何东西。Jackson 从 JSON 字符串反序列化到 Apple 的效果好吗?您的 Apple 对象是如何创建的?是否Apple1正确转义字符串?你也可以试试

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

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

因为上次我发现如果没有[]部分,Spring 不能很好地处理数组。

于 2012-09-18T18:50:20.640 回答