2017-03-28 38 views
1

残りのAPIのjsonインターフェイスでsnake_caseとcamelCaseの両方をサポートしたいと考えています。spring boot REST APIでjacksonにsnake_case/camelCaseをオンデマンドで使用させることを薦めますか?

ジャクソンはデフォルトでcamelCaseを使用します。私は、ジャクソンがsnake_caseを使用することの多くの方法があります知っている:と@JsonProperty("first_name")

注釈クラス:個別

注釈のプロパティ spring.jackson.property-naming-strategy=SNAKE_CASE

:application.properties内部アプリケーション全体に適用すること @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

しかし、消費者が希望のケースを要求できるようにする方法に関する情報は見つかりませんでした。だから、1のユースケースは、カスタムJSONメディアタイプを使用してコンテンツネゴシエーションを提供することができ

@RequestMapping("/my-resource") 
public interface ApiController { 
    @RequestMapping(method = RequestMethod.POST, produces = {"application/json"}) 
    MyResource createResource(@RequestBody MyResource myResource); 

    @GetMapping(value="/{resourceId}", produces = {"application/json"}) 
    MyResource readResource(@PathVariable String resourceId); 
} 

:たとえば

コンテンツネゴシエーション(受け入れ、のContent-Typeヘッダ)を使用して、我々は次の例があるとしましょう

Accepts: application/vnd.snake+json

を、デフォルトapplication/jsonはキャメルケースを使用するようにしましょう:ヘッダが好きです。

しかし、jacksonにコンテンツネゴシエーションに基づいて2つの異なるMapper構成を使用させる方法が見つかりません。

+0

のように思えます価値ある目的ですが、実際にはapiの表面積(必要なテストが必要)を2倍にしています。 2つの異なる 'Mapper'を作成し、両方を試みる必要があります。そして、両方のマッピングが(潜在的に)有効である可能性があります。 [Mapper Features](https://github.com/FasterXML/jackson-databind/wiki/Mapper-Features)から* JacksonはObjectMapperを使用する前にのみ定義できるマッパーごとの設定のセットを定義します。つまり、これらの設定は、リクエストごとにオンザフライで変更することはできません。 –

答えて

1

良い質問ですが、私はcontent negotiationhttp message converterトピックを調べることをお勧めします。

あなたがアプリケーション/ vnd.snake + JSONまたはアプリケーション/ JSONを生成するためにMappingJackson2HttpMessageConverter の2つのインスタンスを設定することができそうです。その特定のメディアタイプを持つとは異なるがを構成し 設定ObjectMapper

コード変更缶は、次のようになります。

MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter 
{ 
    public MyMappingJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType mediaType) 
    { 
    super(objectMapper, mediaType); 
    } 
} 

設定することができようになります:2つのフォーマットをサポートしたくて

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(
    List<HttpMessageConverter<?>> converters) {  
     converters.add(new MyMappingJackson2HttpMessageConverter(snake, new MediaType("application", "vnd.snake+json"))); 
     converters.add(new MappingJackson2HttpMessageConverter(camel, MediaType.APPLICATION_JSON)); 
     super.configureMessageConverters(converters); 
} 
... 
関連する問題