无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper [英] Can't set ProblemHandler to ObjectMapper in Spring Boot
问题描述
我尝试使用 Jackson2ObjectMapperBuilderCustomizer 将自定义问题处理程序添加到对象映射器:
I tried to add custom problem handler to object mapper with Jackson2ObjectMapperBuilderCustomizer:
@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 bean 时,_problemHandlers 属性为 null.
But when i autowired ObjectMapper bean _problemHandlers property is null.
我还尝试使用以下方法自定义现有的 ObjectMapper:
I also tried just customize existed ObjectMapper with:
@Autowired
public customize(ObjectMapper mapper) {
...
}
但结果是一样的.我不知道谁能抹掉这个财产.我根本没有在另一个地方初始化对象映射器的另一个构建器/工厂/等.我做错了什么?
But result is the same. I don't know who can erasure this property. I don't initialize another builders/factories/etc of object mapper in another place at all. What i'm doing wrong?
推荐答案
不可能通过 Jackson2ObjectMapperBuilder
直接将 DeserializationProblemHandler
添加到 ObjectMapper
code> 或 Jackson2ObjectMapperBuilderCustomizer
.在构建器上调用 build()
是行不通的,因为结果 ObjectMapper
是方法本地的:Spring 本身将调用 build()
稍后,创建另一个 ObjectMapper
实例.
It's not possible to directly add a DeserializationProblemHandler
to the ObjectMapper
via a Jackson2ObjectMapperBuilder
or Jackson2ObjectMapperBuilderCustomizer
. Calling build()
on the builder is a no-go, since the resulting ObjectMapper
is local to the method: Spring itself will call build()
later, creating another ObjectMapper
instance.
但是,可以通过注册 Jackson 模块来实现:
However, it's possible to do so by registering a Jackson module :
- 构建器有一个
modules()
方法 - 模块可以通过
setupModule()
访问SetupContext
实例,该实例具有addDeserializationProblemHandler()
方法
- the builder has a
modules()
method - the module has access via
setupModule()
to aSetupContext
instance, which has aaddDeserializationProblemHandler()
method
这应该可以工作
@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);
}
}
这篇关于无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!