报错信息:错误的请求: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
注解将不会生效。