前后端交互,前端json参数不能实例化为对象的问题分析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cchengone/article/details/81218845

1.问题:

系统前后端以POST+json的方式进行交互,但是后端接口的入参对象一直无法实例化,日志中也未打出json转换的异常。

 

前端入参json如下:

{

    "instruction": {

        "approveDecision": 1,

        "type": null,

        "subType": 2,

        "content": "test"

    },

    "supplementForm": {

        "taskId": "690313",

        "supplementInfo": {

            "supplementId": 28

        }

    }

}

 

后端接口代码如下:

 

2.问题分析:

  1. 其余的类似接口访问没问题,json都能正常转换为入参的对象;
  2. 对象中各个字段的拼写均无问题;
  3. 在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.mobile.filter.MultiReadHttpServletRequest$CachedServletInputStream@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.小结:

在重写类的构造方法的时候,最好还是顺便把无参的构造方法也写出来,就可避免此种问题。

如下为解决方法:

展开阅读全文

没有更多推荐了,返回首页