AWS Lambda含空格JSON键反序列化Java对象字段为空问题
可能的原因及解决方案
1. Lombok @Builder与Jackson @JsonProperty的冲突
你的Values和DetailedInformation类同时用了@Builder和Jackson的@JsonProperty,但Lombok默认生成的Builder参数名是驼峰式的detailedInformation,而JSON键是带空格的Detailed Information。Lambda反序列化事件时,Jackson可能优先用Builder实例化对象,但Builder参数名和JSON键不匹配,导致字段无法赋值。
解决办法:
给类添加@Jacksonized注解(需要Lombok 1.18.14+版本),让Lombok生成的Builder兼容Jackson注解:
// Values类修改后 @Data @Builder @Jacksonized @NoArgsConstructor @AllArgsConstructor public class Values { @JsonProperty("Detailed Information") private DetailedInformation detailedInformation; } // DetailedInformation类修改后 @Data @Builder @Jacksonized @NoArgsConstructor @AllArgsConstructor public class DetailedInformation { @JsonProperty("Organization") private String organization; // 其他字段同理 }
如果无法升级Lombok,可手动给Builder参数加@JsonProperty:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class Values { @JsonProperty("Detailed Information") private DetailedInformation detailedInformation; public static class ValuesBuilder { @JsonProperty("Detailed Information") private DetailedInformation detailedInformation; } }
2. AWS Lambda自带Jackson版本冲突
AWS Lambda运行环境自带Jackson库,如果项目依赖的Jackson版本和环境版本不一致,可能导致@JsonProperty注解失效。
解决办法:
- 用Maven或Gradle的打包插件(如
maven-shade-plugin、shadowJar)构建Fat Jar,将项目依赖的Jackson库一起打包,确保运行时使用指定版本。 - 避免使用
providedscope排除Jackson依赖,可能引发其他兼容性问题。
3. 未配置Jackson支持Lombok
Jackson默认不识别Lombok注解,可能无法正确处理@Data生成的getter/setter,导致字段无法赋值。
解决办法:
添加jackson-datatype-lombok依赖:
Maven:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-lombok</artifactId> <version>你的Jackson版本</version> </dependency>
Gradle:
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-lombok:你的Jackson版本'
如果手动使用ObjectMapper,需注册Lombok模块:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new LombokModule());
4. 键名拼写或格式错误
仔细核对JSON键名和@JsonProperty中的字符串,确保空格、大小写完全一致,比如"Detailed Information"不能写成"DetailedInformation"或"detailed information"。
5. Lambda默认反序列化配置问题
尝试绕过Lambda默认反序列化,手动处理事件字符串:
public class InvokeMyRestAPI implements RequestHandler<String, String> { @SneakyThrows @Override public String handleRequest(String eventStr, Context context) { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new LombokModule()); Values event = objectMapper.readValue(eventStr, Values.class); log.info(event); // 后续业务代码不变 } }
如果手动反序列化能成功,说明Lambda默认反序列化配置存在问题,可继续排查环境配置。
内容的提问来源于stack exchange,提问作者Luis Felipe Gongora Garcia

