2017-09-19 4 views
1

Je veux créer mon propre jacksonObjectMapper haricot, comme suit:Comment forcer Jackson2ObjectMapperBuilder dans spring-boot?

@SpringBootApplication 
@AutoConfigureBefore(JacksonAutoConfiguration.class) //even this does not help 
public class MyConfig extends SpringBootServletInitializer { 
    @Bean 
    @Primary 
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { 
     return builder.createXmlMapper(true).build(); //much more configurations 
    } 
} 

Problème: le haricot est jamais créé, mais la valeur par défaut JacksonAutoConfiguration est exécuté:

package org.springframework.boot.autoconfigure.jackson; 

@Configuration 
@ConditionalOnClass(ObjectMapper.class) 
public class JacksonAutoConfiguration { 
     @Bean 
     @Primary 
     @ConditionalOnMissingBean(ObjectMapper.class) 
     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { 
      return builder.createXmlMapper(false).build(); //this is always executed! 
     } 
} 

donc en quelque sorte le haricot ObjectMapper n'est pas encore présent lorsque JacksonAutoConfiguration est évalué. Mais pourquoi? En déboguant avec des points d'arrêt, je peux également voir que mon bean est jamais invoqué! MAIS ce que j'ai remarqué: même si j'ai le @AutoConfigureBefore, le jackson autoconfig est toujours exécuté avant l'un des haricots en MyConfig. Étrange?

+0

Juste pour clarifier: vous avez placé le point d'arrêt du débogueur là et il n'est jamais invoqué, n'est-ce pas? – Andremoniy

+0

Exactement, mon bean 'ObjectMapper' est complètement négligé (ce qui n'est pas le cas pour tous les autres beans de la même classe' MyConfig') – membersound

+0

Pouvez-vous fournir plus de contexte pour votre question? D'après ce que vous avez montré, il n'est pas clair que 'MyConfig' devrait être utilisé.Exécutez-vous votre application comme un pot, une guerre, dans votre EDI, quelque chose d'autre? A quoi ressemble sa méthode principale si elle en a un? [Exemple minimal, complet, vérifiable] (/ help/mcve) rendrait les choses beaucoup plus claires –

Répondre

1

Here's documentation de printemps pour ObjectMapper sur mesure, voici ce qu'il dit:

Si vous souhaitez remplacer la valeur par défaut ObjectMapper complètement, soit définir une @Bean de ce type et la marquer comme @Primary, ou, si vous préférez l'approche basée sur le constructeur, définissez un Jackson2ObjectMapperBuilder @Bean. Notez que dans les deux cas cela désactivera toute la configuration automatique de l'ObjectMapper.

Si la définition ObjectMapper haricot ne permet pas, pourriez-vous essayer de définir la place Jackson2ObjectMapperBuilder haricots?

Aussi, pourriez-vous essayer de définir les beans dans une classe annotée avec @Configuration?

+0

Il s'est avéré que je devais déplacer la définition du bean vers sa propre classe '@ Configuration' Je ne sais pas pourquoi il est ignoré si dans la classe principale' SpringBootApplication' – membersound

+0

peut-être ' @ SpringBootApplication' ne prolonge pas l'annotation/l'interface '@ Configuration' De toute façon, vous pouvez marquer la réponse comme acceptée si elle vous a aidé. –