2017-10-09 2 views
2

Ich habe versucht, kundenspezifisches Problem Handler hinzuzufügen Mapper mit Jackson2ObjectMapperBuilderCustomizer zum Objekt:kann nicht eingestellt ProblemHandler zu ObjectMapper im Frühjahr Boot-

@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); 
         } 
        } 
      ); 
     } 
    }; 
} 

Aber wenn ich ObjectMapper Bohne _problemHandlers autowired Eigenschaft ist null.

Ich habe versucht, auch nur existierte customize ObjectMapper mit:

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

Aber Ergebnis ist das gleiche. Ich weiß nicht, wer diese Eigenschaft löschen kann. Ich initialisiere keine anderen Ersteller/Fabriken/etc von Objekt Mapper an einem anderen Ort. Was mache ich falsch?

Antwort

2

Es ist nicht möglich, über Jackson2ObjectMapperBuilder oder Jackson2ObjectMapperBuilderCustomizer eine DeserializationProblemHandler direkt an die ObjectMapper anzufügen. Der Aufruf von build() auf dem Builder ist ein No-Go, da das Ergebnis ObjectMapper lokal für die Methode ist: Spring selbst ruft build() später auf, Erstellen einer anderen ObjectMapper Instanz.

Allerdings ist es möglich, dies zu tun, indem ein Jackson-Modul registriert:

  • der Bauherr hat eine modules() Methode
  • das Modul Zugriff über setupModule() auf eine SetupContext Instanz, die eine addDeserializationProblemHandler() Methode hat

arbeiten Dies sollte dann

@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); 
    } 
}