GraalVM Native Image下@JsonFormat日期格式化配置不生效问题
问题原因
GraalVM原生镜像编译时会执行静态分析,只会把编译期能探测到的类、方法、注解元信息打包进最终的二进制文件。该问题属于Micronaut 3.1.4版本整合Jackson的GraalVM适配缺陷:
- 基于注解驱动的Jackson序列化/反序列化规则(包括
@JsonFormat注解、自定义序列化器的@JsonSerialize注解)的元信息在静态分析阶段没有被正确扫描,导致运行时原生镜像找不到对应的序列化规则,降级为默认的日期数组序列化格式 - 自定义序列化器类没有被GraalVM注册为反射可访问类,也没有被Jackson的序列化器工厂探测到,所以不会触发执行
解决方案
方案一:升级Micronaut版本
该问题已经在后续版本的Micronaut中修复,直接将Micronaut版本升级到3.2.0及以上版本即可,官方已经完善了Jackson注解的GraalVM元数据扫描逻辑,不需要额外配置。
方案二:3.1.4版本手动适配
如果暂时无法升级版本,可以手动添加以下配置保证序列化规则生效:
- 强制注册Jackson序列化规则,添加配置类:
@Factory public class JacksonConfig { @Bean @Primary public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 关闭默认日期数组序列化 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 注册全局日期格式 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 手动注册自定义序列化器 objectMapper.registerModule(new SimpleModule().addSerializer(Date.class, new CustomDateSerializer())); return objectMapper; } }
- 在
src/main/resources/META-INF/native-image目录下新增GraalVM反射配置文件reflect-config.json,显式注册相关类的访问权限:
[ { "name": "me.jics.CustomDateSerializer", "allDeclaredConstructors": true, "allPublicMethods": true }, { "name": "com.fasterxml.jackson.annotation.JsonFormat", "allDeclaredMethods": true } ]
- 重新执行原生镜像编译命令即可生效。
内容的提问来源于stack exchange,提问作者jics
相关产品推荐
相关产品推荐

