ジャクソンは、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
それもうまくいきませんでした
@EnableWebMvc
アノテーション(私のアプリケーション(face-Palm!)のクラス(ExceptionHandler)の1つ)。
しかし、このように issue 、
@EnableWebMvcアノテーションがある場合は、Jacksonのシリアル化をカスタマイズするためのメッセージコンバーターの構成を含む、Spring MVCの自動構成を無効にします。
@EnableWebMvcを使用すると、Spring MVCの構成を制御することをSpring Bootに指示しているため、これは予想される動作です。これには、HTTPメッセージコンバーターを構成して、ニーズを満たす方法でJSONを(非)シリアル化することが含まれます。
Jackson構成をオーバーライドする場合は、spring.jackson。*プロパティを使用するか、さらに制御が必要な場合は、独自のJackson2ObjectMapperBuilder Beanを宣言します。
削除したら@EnableWebMvc
アノテーション、このプロパティは期待どおりに機能します。
文書によると
/**
* 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
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);
}
}
}
}
おそらくあなたが作成したクラスextends WebMvcConfigurationSupport
、WebMvcConfigurationSupport
は@EnableWebMvcを含み、WebMvcConfigurationSupport
を拡張せず、いくつかのクラスextends WebMvcConfigurationSupport
を使用します
@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));
}
}
記録として、同様の問題を解決するために、これを私のapplication.propertiesに追加し、うまく機能しました:spring.jackson.property-naming-strategy=SNAKE_CASE
他の回答のようにSNAKE_CASEを完全に修飾する必要はありません。