2017-10-09 9 views
2

J'ai essayé d'ajouter gestionnaire de problème personnalisé pour objet mappeur avec Jackson2ObjectMapperBuilderCustomizer:Impossible de définir ProblemHandler à ObjectMapper au printemps 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); 
         } 
        } 
      ); 
     } 
    }; 
} 

Mais quand j'autowired la propriété de haricot ObjectMapper est nulle.

J'ai aussi essayé juste personnalisons avec existais ObjectMapper:

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

mais le résultat est le même. Je ne sais pas qui peut effacer cette propriété. Je n'initialise pas d'autres constructeurs/usines/etc de mappeur d'objet dans un autre endroit. Qu'est-ce que je fais mal?

Répondre

2

Il n'est pas possible d'ajouter directement un DeserializationProblemHandler au ObjectMapper via un Jackson2ObjectMapperBuilder ou Jackson2ObjectMapperBuilderCustomizer. Appeler build() sur le constructeur est un no-go, puisque le résultat ObjectMapper est local à la méthode: Spring lui-même appellera build() plus tard, en créant une autre instance ObjectMapper.

Cependant, il est possible de le faire en vous inscrivant un module Jackson:

  • le constructeur a une méthode modules()
  • le module a accès via setupModule() à une instance SetupContext, qui a une méthode addDeserializationProblemHandler()

Cela devrait alors travailler

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