无法设置ProblemHandler到ObjectMapper在春季启动
问题描述:
我尝试添加自定义的问题处理程序与Jackson2ObjectMapperBuilderCustomizer到对象映射:无法设置ProblemHandler到ObjectMapper在春季启动
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
ObjectMapper m = builder.build();
m.addHandler(
new DeserializationProblemHandler() {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}
);
}
};
}
但是,当我自动装配ObjectMapper豆_problemHandlers属性为null。
我也尝试了定制存在ObjectMapper有:
@Autowired
public customize(ObjectMapper mapper) {
...
}
但结果是一样的。我不知道谁可以删除这个属性。我根本不在其他地方初始化另一个建造者/工厂/等对象映射器。我做错了什么?
答
无法通过Jackson2ObjectMapperBuilder
或Jackson2ObjectMapperBuilderCustomizer
将DeserializationProblemHandler
直接添加到ObjectMapper
。在构建器上调用build()
是不可行的,因为产生的ObjectMapper
是本地方法:Spring本身稍后将调用build()
,创建另一个ObjectMapper
实例。
但是,它可能通过注册杰克逊模块可以这样做:
- 建设者有一个
modules()
方法 - 模块具有通过
setupModule()
访问SetupContext
实例,其中有一个addDeserializationProblemHandler()
方法
这应该工作,那么
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.modules(new MyModule());
}
};
}
private static class MyModule extends SimpleModule {
@Override
public void setupModule(SetupContext context) {
// Required, as documented in the Javadoc of SimpleModule
super.setupModule(context);
context.addDeserializationProblemHandler(new MyDeserializationProblemHandler());
}
}
private static class MyDeserializationProblemHandler extends DeserializationProblemHandler {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt,
JsonParser p,
JsonDeserializer<?> deserializer,
Object beanOrClass,
String propertyName)
throws IOException {
System.out.println("ahahahaa");
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
}