web-dev-qa-db-ja.com

ジャクソンは私の春のブートアプリケーションでspring.jackson.propertiesを無視しています

ジャクソンは、spring.jackson.property-naming-strategy = SNAKE_CASEを無視しています。私はspringBootVersion 1.4.2.RELEASEを使用しています。私のapplication.propertiesファイルに、私は追加しました

spring.jackson.property-naming-strategy = SNAKE_CASE

しかし、ジャクソンはこのプロパティを尊重しておらず、私のREST=応答はまだcamelCaseです。興味深いことに、この注釈はうまく機能します

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

この注釈により、snake_case応答が返されます。しかし、私は各応答クラスに注釈を付けたくありません、それは少し面倒です。

編集する

完全修飾クラス名も使用してみましたが、

spring.jackson.property-naming-strategy = com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy

それもうまくいきませんでした

15
so-random-dude

@EnableWebMvcアノテーション(私のアプリケーション(face-Palm!)のクラス(ExceptionHandler)の1つ)。

しかし、このように issue

@EnableWebMvcアノテーションがある場合は、Jacksonのシリアル化をカスタマイズするためのメッセージコンバーターの構成を含む、Spring MVCの自動構成を無効にします。

@EnableWebMvcを使用すると、Spring MVCの構成を制御することをSpring Bootに指示しているため、これは予想される動作です。これには、HTTPメッセージコンバーターを構成して、ニーズを満たす方法でJSONを(非)シリアル化することが含まれます。

Jackson構成をオーバーライドする場合は、spring.jackson。*プロパティを使用するか、さらに制御が必要な場合は、独自のJackson2ObjectMapperBuilder Beanを宣言します。

削除したら@EnableWebMvcアノテーション、このプロパティは期待どおりに機能します。

14
so-random-dude

文書によると

/**
 * One of the constants on Jackson's PropertyNamingStrategy
 * (CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES). Can also be a fully-qualified class
 * name of a PropertyNamingStrategy subclass.
 */
private String propertyNamingStrategy;

これを「application.properties」で設定できます:

spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy
3
Liping Huang

MappingJackson2HttpMessageConverterクラスは Jackson2ObjectMapperBuilder.json() メソッドによって作成されたデフォルトのインスタンスを使用します。アプリケーションconextのObjectMapperを使用するために、カスタム WebMvcConfigurerAdapter を登録できます。

@Configuration
public class WebMvcDefaultObjectMapperConfigurerAdapter extends WebMvcConfigurerAdapter {

    private ObjectMapper mapper;

    @Autowired
    public WebMvcDefaultObjectMapperConfigurerAdapter(ObjectMapper mapper) {
        // default mapper configured with spring.*
        this.mapper = mapper;
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> httpConverter : converters) {
            if (httpConverter instanceof MappingJackson2HttpMessageConverter) {
                // register the configured object mapper to HttpMessageconter
                ((MappingJackson2HttpMessageConverter) httpConverter).setObjectMapper(mapper);
            }
        }
    }
}
2
skadya

おそらくあなたが作成したクラスextends WebMvcConfigurationSupportWebMvcConfigurationSupportは@EnableWebMvcを含み、WebMvcConfigurationSupportを拡張せず、いくつかのクラスextends WebMvcConfigurationSupportを使用します

0
王晓风

@skadyaの答えと同じように、私はそれを新しい春バージョンとJava 8スタイルで更新します。

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private ObjectMapper mapper;

    @Autowired  // spring.jackson.* ObjectMapper's config
    public WebConfig(ObjectMapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public void extendMessageConverters (List<HttpMessageConverter<?>> converters) {
        converters.stream()
                .filter(x -> x instanceof  MappingJackson2HttpMessageConverter)
                .forEach(x -> ((MappingJackson2HttpMessageConverter) x).setObjectMapper(mapper));
    }
}
0
Neo Pham

記録として、同様の問題を解決するために、これを私のapplication.propertiesに追加し、うまく機能しました:spring.jackson.property-naming-strategy=SNAKE_CASE

他の回答のようにSNAKE_CASEを完全に修飾する必要はありません。

0
Chris Paika