错误的请求:org.springframework.http.coverter。HttpMessageNotReadableException:JSON解析错误:无法识别的字段“xxxx”

报错信息:错误的请求:org.springframework.http.coverter。HttpMessageNotReadableException:JSON解析错误:无法识别的字段“userRealname”(类com.lms.UserRoleDTO),未标记为可忽;

1 问题:

@RequestMapping("deleteBinding")
public R<Boolean> deleteBinding(@RequestBody  UserRoleDTO entity) {
       ...
}
请求上面的接口时,json无法转换为UserRoleDTO导致

1.1 UserRoleDTO代码:

public class UserRoleDTO implements Serializable {
    private Integer userId;
    private Integer roleId;
}

1.2 浏览器传递的json:

{
	"userRealname": "张三",
	"roleId": 1,
	"userId": 1
}

2 解决:(三种方式)

2.1 UserRoleDTO中添加字段userRealname

如下:(注意缺几个,添加几个)

public class UserRoleDTO implements Serializable {
    private String userRealname;
    private Integer userId;
    private Integer roleId;
}

2.2 json中删除字段userRealname(如果userRealname用不到)

2.3 添加一个配置类

如下:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;

@Configuration
public class CustomBeans {

    @Autowired
    protected ObjectMapper objectMapper;

    @EventListener({ApplicationReadyEvent.class})
    public void customizeJackson() {

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    }

}

解释:

使用Spring的@Autowired注解自动注入一个ObjectMapper实例。ObjectMapper是Jackson库的核心类,用于将Java对象转换为JSON字符串,以及将JSON字符串转换为Java对象。

监听ApplicationReadyEvent事件

使用Spring的@EventListener注解,customizeJackson方法会在Spring Boot应用程序完全启动并准备好接收请求时执行。ApplicationReadyEvent事件在Spring Boot应用程序完成所有初始化工作并准备运行时触发。

自定义Jackson配置

在customizeJackson方法中,配置了ObjectMapper的FAIL_ON_UNKNOWN_PROPERTIES特性。默认情况下,当Jackson尝试将JSON字符串反序列化为Java对象时,如果JSON字符串中包含Java对象没有的字段,它会抛出一个异常。通过将此特性设置为false,Jackson在遇到未知属性时将不会抛出异常,而是忽略这些属性。

总结

这个CustomBeans类的主要目的是在Spring Boot应用程序启动并准备好时,自定义Jackson的ObjectMapper,使其在处理JSON时不会因为未知属性而抛出异常。这是通过监听ApplicationReadyEvent事件并在事件触发时执行自定义配置来实现的。

请注意,CustomBeans类本身应该是一个Spring管理的bean(比如通过@Component注解标记),以便Spring能够注入ObjectMapper实例,并在应用程序准备好时调用customizeJackson方法。如果CustomBeans类没有被Spring管理,那么@Autowired@EventListener注解将不会生效。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值