实体Getter方法返回Null引发NullPointerException问题排查求助
问题分析与解决方案
首先明确:你的opinion.getCollaboratorName()返回null不是因为getter方法失效——从控制台打印的opinion.toString()结果来看,Opinion对象本身的collaboratorName字段就是null,getter只是如实返回了这个值。
核心原因排查
从控制台输出能看到两个关键信息:
- 从
@RequestBody解析得到的Opinion对象,collaboratorName始终为null - JWT令牌里的
opinionsList中,id=8的Opinion的collaboratorName是有值的(Stasy)
这说明前端发送PUT请求时,没有将collaboratorName字段(或对应正确的键名)包含在请求体的JSON中,或者JSON键名和实体类字段名不匹配,导致Jackson无法正确将JSON值映射到实体类字段。
具体排查步骤与修复方案
1. 检查前端请求体的JSON结构
确认前端发送的PUT请求的JSON数据里,是否包含collaboratorName字段(注意是驼峰命名)。如果前端传的是下划线命名的collaborator_name,可以通过以下方式处理:
- 方案一:修改前端,将字段名改为驼峰的
collaboratorName - 方案二:在实体类字段上添加
@JsonProperty("collaborator_name")注解,指定JSON序列化时的键名:
@Column(name="collaborator_name",nullable=false) @JsonProperty("collaborator_name") private String collaboratorName;
或者全局开启Spring Boot的下划线转驼峰配置,在application.properties中添加:
spring.jackson.property-naming-strategy=SNAKE_CASE
2. 确认实体类的序列化基础配置
Jackson默认需要无参构造函数来实例化对象,如果你的Opinion类只有带参构造,会导致字段无法正确赋值。添加无参构造:
public Opinion() { }
3. 修复控制器中的变量名错误(额外问题)
你的控制器代码里存在未定义变量的笔误,会引发另一个NullPointerException:
String username = jwtDecoder.decodeUserInfoFromDashboardToken(dashboardToken); System.out.println("email in PutMapping Opinions:" + username); // 此处email变量未定义,需替换为实际从JWT中提取的邮箱值或修正变量名 User user = userServiceImpl.findUserByEmail(email);
验证方法
修改后,先用Postman等工具发送包含collaboratorName字段的PUT请求,确认控制台打印的Opinion对象中该字段有值,再测试业务逻辑。
内容的提问来源于stack exchange,提问作者Tsai Hsuan Hsieh
相关产品推荐
相关产品推荐

