Java Jackson ObjectMapper忽略Hibernate5模块
我有以下杰克逊配置Java Jackson ObjectMapper忽略Hibernate5模块,java,hibernate,spring-boot,jackson,mapping,Java,Hibernate,Spring Boot,Jackson,Mapping,我有以下杰克逊配置 @Configuration public class JacksonConfiguration { @Bean public JavaTimeModule javaTimeModule() { return new JavaTimeModule(); } @Bean public Jdk8Module jdk8TimeModule() { return new Jdk8Module(); }
@Configuration
public class JacksonConfiguration {
@Bean
public JavaTimeModule javaTimeModule() {
return new JavaTimeModule();
}
@Bean
public Jdk8Module jdk8TimeModule() {
return new Jdk8Module();
}
@Bean
public Hibernate5Module hibernate5Module() {
return new Hibernate5Module();
}
@Bean
public AfterburnerModule afterburnerModule() {
return new AfterburnerModule();
}
@Bean
ProblemModule problemModule() {
return new ProblemModule();
}
@Bean
ConstraintViolationProblemModule constraintViolationProblemModule() {
return new ConstraintViolationProblemModule();
}
}
然后,我添加了一个JsonUtil类,该类使用JacksonConfiguration.class中描述的模块创建一个对象映射器对象
@RequiredArgsConstructor
public class JsonUtil {
private static ObjectMapper mapper;
public static synchronized ObjectMapper getObjectMapper() {
if (mapper == null) {
mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new Hibernate5Module());
mapper.registerModule(new AfterburnerModule());
mapper.registerModule(new ProblemModule());
mapper.registerModule(new ConstraintViolationProblemModule());
}
return mapper;
}
现在,只要调用REST控制器,就会调用objectmapper的实现(JsonUtil.mapper)
问题是我有一个Instant变量类型的类,以前的版本将其反序列化为datetime(或者由于数据库中的值是datetime而保持不变),当前的实现反序列化为epoch time
public class SomeClass {
// ...
@NotNull
@Column(name = "column3", nullable = false)
private Instant someVariable;
}
在“someVariable”之前:“2018-10-23T08:11:00Z”“SomeVariable”之后:1540282260 为什么Jackson不能像以前一样序列化这个变量,尽管我已经注册了JacksonConfiguration类中的所有模块
springBoot:2.0.8删除
JsonUtil
和插孔配置
。只需添加您想要注册的其他模块,Spring Boot就会自动获取这些模块并配置jackson。您当前的方法禁用了导致此问题的Jackson的默认Spring(Boot)设置。@M.Deinum JsonUtil无法删除,因为将有fromJson、toJson方法。每个方法都将使用getObjectMapper()方法来获取对象映射器。使用这种方法可以保证spring和定制JsonUtil方法将使用相同的映射器。spring Boot已经解决了这个问题。您应该使用框架,您正试图围绕框架进行编码,从而导致问题。只需注入一个ObjectMapper
,您就会得到一个预先配置好的实例。@M.Deinum对于不可能注入的静态方法呢?首先应该将其视为设计缺陷。如果您真的想要这些,您可以滥用JsonUtil
,让它使用ObjectMapper
,并将其作为static
变量提供。但首先我会认为这是一个设计缺陷。
public class SomeClass {
// ...
@NotNull
@Column(name = "column3", nullable = false)
private Instant someVariable;
}