在AWS的Spring Cloud Function中配置自定义Jackson序列化/反序列化
解决Spring Cloud Function部署AWS Lambda时Jackson自定义配置问题
核心问题分析
Spring Cloud Function的AWS适配器并未直接使用Spring容器中注册的ObjectMapper Bean,而是通过自身的JacksonMapper实例处理序列化/反序列化,因此直接标记@Primary的ObjectMapper无法生效。另外你遇到的空输入转换错误,是因为Supplier类型函数在Lambda触发时可能接收空请求体,默认转换逻辑会尝试解析空内容导致异常。
解决方案步骤
1. 封装ObjectId序列化/反序列化到Jackson模块
将你已实现的ObjectIdJsonConverter中的序列化器/反序列化器封装为Jackson模块,便于统一注册:
public class ObjectIdModule extends SimpleModule { public ObjectIdModule() { addSerializer(ObjectId.class, new ObjectIdJsonConverter.ObjectIdSerializer()); addDeserializer(ObjectId.class, new ObjectIdJsonConverter.ObjectIdDeserializer()); } }
2. 实现JsonMapperCustomizer定制Jackson配置
通过Spring Cloud Function提供的JsonMapperCustomizer接口,直接修改AWS适配器使用的JacksonMapper实例:
@Component public class CustomJsonMapperConfig implements JsonMapperCustomizer { @Override public void customize(JacksonMapper jacksonMapper) { // 注册ObjectId自定义模块 jacksonMapper.getObjectMapper().registerModule(new ObjectIdModule()); // 可添加其他Jackson全局配置,比如忽略未知属性 jacksonMapper.getObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } }
3. 配置空输入处理避免转换错误
针对Supplier类型函数(如你的ListCustomers),在application.properties中添加配置,允许空请求体:
spring.cloud.function.adapter.aws.supplier.use-empty-payload=true
4. 调整Subscriber类注解(可选)
由于已经通过全局模块注册了序列化/反序列化规则,无需在_id字段上单独添加@JsonSerialize和@JsonDeserialize注解,保持类简洁:
@NoArgsConstructor @Data @Document("subscriber") public class Subscriber { @Id private ObjectId _id; private String firstName; private String lastName; private String emailAddress; }
验证
重新打包部署到AWS Lambda后,测试调用:
- 当返回
Subscriber数据时,_id会按你的自定义规则序列化为字符串 - 空输入触发的Lambda调用(如定时触发)不会再出现
MismatchedInputException异常
内容的提问来源于stack exchange,提问作者user521990
相关产品推荐
相关产品推荐

