2017-08-09 10 views
4

はそれがSpringbootにMappingJackson2HttpMessageConverter異なるを使用二つの異なる@RestControllersを持つことは可能ですか? ...または、スプリングブートアプリケーションのすべての@RestControllerに共通のMappingJackson2HttpMessageConverterですか?異なる構成で2 @RestControllers

基本的に目標は、ジャクソンミックスインを使用してJsonの名前を2番目のコントローラのpriceIdに変更する異なるJackson ObjectMapperを含む別のMappingJackson2HttpMessageConverterを使用することです。

どの第1のコントローラへの呼び出しだろう:

http://localhost:8080/controller1/price

{ID: "ID"、説明: "説明"}

第二のコントローラへの呼び出しがどうなるのか。

http://localhost:8080/controller2/price

{priceId: "ID"、説明: "説明"}

よろしく

@SpringBootApplication 
public class EndpointsApplication { 

public static void main(String[] args) { 
    SpringApplication.run(EndpointsApplication.class, args); 
} 

@Data // Lombok 
@AllArgsConstructor 
class Price { 
    String id; 
    String description; 
} 

@RestController 
@RequestMapping(value = "/controller1") 
class PriceController1 { 

    @GetMapping(value = "/price") 
    public Price getPrice() { 
     return new Price("id", "Description"); 
    } 
} 

@RestController 
@RequestMapping(value = "/controller2") 
class PriceController2 { 

    @GetMapping(value = "/price") 
    public Price getPrice() { 
     return new Price("id", "Description"); 
    } 
} 

} 

GitHubの:

https://github.com/fdlessard/SpringBootEndpoints

+1

この投稿はhttps://stackoverflow.com/questions/34728814/spring-boot-with-two-mvc-configurationsをご覧ください。 – Akash

答えて

3

MappingJackson2HttpMessageConverter@RestControllerで注釈全てコントローラため、それにもかかわらず、この問題を回避方法があるが一般的です。一般的な解決策は、コントローラによって返された結果をマーカークラスにラップし、カスタムMessageConverter(Example implementation used by Spring Hateoas)を使用するか、カスタム応答メディアタイプを使用することです。

サンプル使用TypeConstrainedMappingJackson2HttpMessageConverterここで、ResourceSupportはマーカークラスです。

MappingJackson2HttpMessageConverter halConverter = 
    new TypeConstrainedMappingJackson2HttpMessageConverter(ResourceSupport.class); 
halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON)); 
halConverter.setObjectMapper(halObjectMapper); 

あなたはここにあなたのコードに基づいて実施例を見つけることができます。 https://github.com/AndreasKl/SpringBootEndpoints

代わりにカスタム・シリアライザは、あなたのPrice転送オブジェクトのために使用することができるPropertyNamingStrategyを使用します。