2016-09-01 6 views
14

Ich konnte nicht finden, Beispiele zu verwenden Jackson2ObjectMapperBuilderCustomizer.java im Frühjahr Boot 1.4, um die Funktionen von Jackson anzupassen.Wie man Jackson im Frühjahr Boot anpassen 1.4

Die doco für Boot in Jackson Customizing 1,4-http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-

Meine Konfiguration funktioniert, obwohl ich bin nicht sicher, ob dies der richtige Weg ist, um das Objekt Mapper mit Jackson2ObjectMapperBuilderCustomizer.java

@Configuration 
public class JacksonAutoConfiguration { 

    @Autowired 
    private Environment env; 

    @Bean 
    public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(
     List<Jackson2ObjectMapperBuilderCustomizer> customizers) { 
     Jackson2ObjectMapperBuilder builder = configureObjectMapper(); 
     customize(builder, customizers); 
     return builder; 
    } 

    private void customize(Jackson2ObjectMapperBuilder builder, 
          List<Jackson2ObjectMapperBuilderCustomizer> customizers) { 
     for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) { 
      customizer.customize(builder); 
     } 
    } 

    private Jackson2ObjectMapperBuilder configureObjectMapper() { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     List<String> activeProfiles = asList(env.getActiveProfiles()); 
     if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) { 
      builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT); 
     } 
     return builder; 
    } 
} 

anpassen Um einen Kontext bereitzustellen, befindet sich diese Klasse in meinem eigenen Spring-Starter-Projekt für REST-Services, das einfach eine Reihe von Dingen wie ControllerAdvice und einige triviale Funktionen wie die oben genannten automatisch konfiguriert.

Also mein Ziel ist es, die Jackson-Konfiguration zu erweitern, anstatt jede Konfiguration zu überschreiben, die von boot oder anderen Paketen bereitgestellt wird.

Antwort

19

Zum Anpassen der Jackson ObjectMapper, die bereits von Spring Boot vorkonfiguriert ist, konnte ich dies tun (das Beispiel hier ist ein benutzerdefinierter Deserializer hinzufügen).

Konfigurationsklasse:

@SpringBootConfiguration 
public class Application { 

    @Autowired 
    private BigDecimalDeserializer bigDecimalDeserializer; 

    ... 

    @Bean 
    public Jackson2ObjectMapperBuilderCustomizer addCustomBigDecimalDeserialization() { 
     return new Jackson2ObjectMapperBuilderCustomizer() { 

      @Override 
      public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { 
       jacksonObjectMapperBuilder.deserializerByType(BigDecimal.class, bigDecimalDeserializer); 
      } 

     }; 
    } 

    ... 

} 

Und meine Gewohnheit Deserializer, zu zeigen, wie es von Frühling abgeholt hat:

@Component 
public class BigDecimalDeserializer extends StdDeserializer<BigDecimal> { 

    public BigDecimalDeserializer() { 
     super(BigDecimal.class); 
    } 

    @Override 
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 
     ... 
    } 

    ... 

} 
+0

Spot auf! Das habe ich ursprünglich versucht, aber ich muss etwas falsch gemacht haben, danke. – Reece

0

nur eine ObjectMapper Bean erstellen:

@Bean 
ObjectMapper objectMapper() { 
    return Jackson2ObjectMapperBuilder 
      .json() 
      .featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION) 
      .build(); 
} 
+1

Leider habe ich wahrscheinlich gemacht haben könnte es klar, dass ich im Wesentlichen gesucht * extend * die Objekt-Mapper-Funktionen. Während Ihr Vorschlag in der Tat alle ObjectMapper-Beans außer Kraft setzen würde, wie die Standard-Spring-Boot-Konfiguration – Reece

6

Es hängt davon ab, was Sie zu tun versuchen.

Wenn Sie zusätzlich zu den Standardeinstellungen noch einige Anpassungen vornehmen möchten, sollten Sie Ihre eigene Jackson2ObjectMapperBuilderCustomizer -Implementierung erstellen und sie als Bean ausgeben. Was Sie derzeit haben, ist eine komplexere Version davon. Anstatt die Customizer zu injizieren und sie dann selbst aufzurufen, können Sie einfach Ihre eigene Customiser-Bean erstellen und Boot ruft sie für Sie an.

Wenn Sie die vollständige Kontrolle übernehmen und alle Boot-Anpassungen ausschalten möchten, erstellen Sie eine Jackson2ObjectMapperBuilder oder ObjectMapper Bean und konfigurieren Sie sie wie erforderlich. Der Builder-Ansatz wird bevorzugt, da dieser Builder dann auch zum Konfigurieren von ObjectMappern verwendet wird, die von anderen Komponenten wie Spring Data REST erstellt wurden.

Wenn Sie Ihren Code betrachten und einen Schritt zurückgehen, können Sie die Dinge viel einfacher konfigurieren, indem Sie eine profilspezifische Konfigurationsdatei (z. B. application-dev.properties) verwenden, um Jackson auszugeben. Sie können mehr darüber lesen here.

+0

Danke, das ist, was ich ursprünglich getan hatte, aber es schien keine Wirkung zu haben. Ich poste den Code, den ich morgen hatte und vielleicht kannst du mir sagen, wo ich nicht falsch liegen würde. Was Ihren Vorschlag betrifft, dies über die Eigenschaftendatei zu konfigurieren, habe ich meine Frage aktualisiert, um ein wenig mehr Kontext für die Verwendung dieser Konfigurationsklasse bereitzustellen. – Reece

Verwandte Themen