2017-10-09 76 views
2

我尝试添加自定义的问题处理程序与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) { 
... 
} 

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

回答

2

无法通过Jackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizerDeserializationProblemHandler直接添加到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); 
    } 
}