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

本文探讨了一种在Spring MVC框架中使用POST+JSON方式交互时遇到的问题:后端接口入参对象无法实例化,且未抛出明显异常。通过调试发现是由于对象中的某个子类重写了构造方法而未提供默认构造器导致。文章提供了详细的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.小结:

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

如下为解决方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值