gpt4 book ai didi

java - 无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:42 32 4
gpt4 key购买 nike

我尝试使用 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);
}
}
);
}
};
}

但是当我 Autowiring ObjectMapper bean 时,_problemHandlers 属性为空。

我还尝试使用以下方法自定义现有的 ObjectMapper:

@Autowired
public customize(ObjectMapper mapper) {
...
}

但结果是一样的。我不知道谁可以删除这个属性。我根本不在另一个地方初始化对象映射器的另一个构建器/工厂/等。我做错了什么?

最佳答案

不可能通过 Jackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizer 直接将 DeserializationProblemHandler 添加到 ObjectMapper。在构建器上调用 build() 是不行的,因为生成的 ObjectMapper 是方法本地的:Spring 本身将调用 build() 稍后,创建另一个 ObjectMapper 实例。

但是,可以通过注册 Jackson 模块来实现:

  • 构建器有一个 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);
}
}

编辑 (2022-06-27)

正如 E-Riz 在评论中提到的,使用较新的 Spring Boot 版本,您只需将模块注册为 Spring Bean,它将与所有其他模块一起在 ObjectMapper 上进行配置模块

// Or declare it as a @Bean in a @Configuration
@Component
public 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);
}
}
}

关于java - 无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644099/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com