1.问题:
系统前后端以POST+json的方式进行交互,但是后端接口的入参对象一直无法实例化,日志中也未打出json转换的异常。
前端入参json如下:
{ "instruction": { "approveDecision": 1, "type": null, "subType": 2, "content": "test" }, "supplementForm": { "taskId": "690313", "supplementInfo": { "supplementId": 28 } } } |
后端接口代码如下:
2.问题分析:
- 其余的类似接口访问没问题,json都能正常转换为入参的对象;
- 对象中各个字段的拼写均无问题;
- 在spring中,配置的json转对象的类是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter,由于其余接口的json实例化为对象都没问题,暂时排除是此Converter的问题。
下图为跟踪DEBUG过程分析过程:
分析:通过debug发现,问题就出在ServletHandlerMethodInvoker.resolveHandlerArgument()方法中。
该方法大致执行过程:
1.判断方法入参的注解是什么,我们使用的注解是RequestBody。
2.用对应注解类型的参数的解析方法,实例化入参对象。
最后发现解析过程中,实例化了一个异常,但未输出到console,异常信息如下:
Could not read JSON: No suitable constructor found for type [simple type, class com.xx.xx.mobile.dto.contract.MobileCaRebateContractSupplement]:
can not instantiate from JSON object (need to add/enable type information?)
at [Source: com.sogou.cm.mob[email protected]2777068f; line: 1, column: 56]
(through reference chain: com.xx.xx.mobile.dto.contract.MobileCaRebateSupplementRequestDto["supplementForm"]->
com.xx.xx.mobile.dto.contract.MobileCaRebateSupplementForm["supplementInfo"])
异常分析:MobileCaRebateContractSupplement这个类没有合适的构造方法。
转眼回去看了下,该类的构造方法被我重写了,导致spring在实例化类的时候,找不到无参的构造方法。
注:Java文件在编译的时候,编译器会判断当前的类有没有构造方法,如果没有,编译器会自动追加一个无参的构造方法。
但是如果存在构造方法了,编译器就不会自动帮忙添加无参构造方法,除非自己写一个无参的构造方法。
3.小结:
在重写类的构造方法的时候,最好还是顺便把无参的构造方法也写出来,就可避免此种问题。
如下为解决方法: