如何在无主类的Spring Boot可执行Jar中全局配置Jackson的JsonIgnoreProperties?
首先明确:完全可行,但因为你的项目没有@SpringBootApplication注解和启动类,Spring Boot的自动配置机制不会触发,所以application.properties中的Jackson配置无法自动生效,需要通过手动配置的方式实现全局设置。
针对被Spring Boot项目引用的场景
如果这个Jar是作为依赖被其他Spring Boot项目调用,你可以创建一个配置类手动配置Jackson的ObjectMapper,让引用方的Spring容器加载这个配置:
方案1:直接配置ObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonGlobalConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 全局关闭未知属性反序列化失败的校验 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return objectMapper; } }
方案2:使用Spring Boot的Jackson2ObjectMapperBuilder
这种方式更贴合Spring Boot的配置风格,还能兼容其他Jackson默认配置:
import com.fasterxml.jackson.databind.DeserializationFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @Configuration public class JacksonGlobalConfig { @Bean public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() { return new Jackson2ObjectMapperBuilder() .featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } }
注意:引用这个Jar的Spring Boot项目需要确保该配置类被Spring容器扫描到,比如在他们的@SpringBootApplication注解中添加扫描路径:
@SpringBootApplication(scanBasePackages = {"你的配置类所在包路径", "引用方自身包路径"}) public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
作为普通Java库使用的场景
如果这个Jar不是被Spring Boot项目引用,而是作为普通工具类库使用,你可以提供一个全局的ObjectMapper实例供内部代码调用:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonUtils { // 全局单例ObjectMapper,预配置忽略未知属性 private static final ObjectMapper GLOBAL_OBJECT_MAPPER; static { GLOBAL_OBJECT_MAPPER = new ObjectMapper(); GLOBAL_OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } private JacksonUtils() {} public static ObjectMapper getGlobalObjectMapper() { return GLOBAL_OBJECT_MAPPER; } }
项目中所有需要序列化/反序列化的地方,直接使用JacksonUtils.getGlobalObjectMapper()即可应用全局配置。
为什么application.properties配置不生效?
Spring Boot的application.properties中的Jackson配置,是通过JacksonAutoConfiguration这个自动配置类来读取并生效的。而这个自动配置类的加载依赖于@SpringBootApplication注解触发的自动配置流程——你的项目没有启动类和该注解,自动配置不会执行,所以配置项自然无法生效。
内容的提问来源于stack exchange,提问作者fakeittillyoumakeit

