2017-03-26 25 views
2

text/javascriptコンテンツタイプを返すRESTfulなサービスを利用したいと思います。SpringブートでのカスタムMessageConverterの登録

Spring Bootでこれを行うことができるOOTB HttpMessageConverterがないので、私はカスタムコンバータを登録したいと思います。

@Component 
public class CustomRestTemplateProvider { 
    public RestTemplate getCustomRestTemplate(MediaType mediaType) { 
     MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); 
     jacksonConverter.setSupportedMediaTypes(Collections.singletonList(mediaType)); 
     List<HttpMessageConverter<?>> converters = new ArrayList<>(); 
     converters.add(jacksonConverter); 
     return new RestTemplate(converters); 
    } 
} 

その後、私のサービスでは、ちょうど上記の溶液が正常に動作しますが、私も試してみましたgetCustomRestTemplate(new MediaType("text", "javascript")

を呼び出す:私はこれを行うには見つけ

一つの方法は、MappingJackson2HttpMessageConverterを変更することでRestTemplate自体をカスタマイズすることですSpring Boot Documentation (27.1.2)

に従って、この1つのメディアタイプを処理する新しいコンバータを作成しました。新しいコンバータを作成しました:

@Component 
public class TextJavascriptMessageConverter extends AbstractJackson2HttpMessageConverter { 

    public TextJavascriptMessageConverter(ObjectMapper objectMapper) { 
     super(objectMapper); 
     setTextJavascriptAsSupportedMediaType(); 
    } 

    private void setTextJavascriptAsSupportedMediaType() { 
     List<MediaType> supportedMediaTypes = new ArrayList<>(); 
     supportedMediaTypes.add(new MediaType("text", "javascript")); 
     setSupportedMediaTypes(supportedMediaTypes); 
    } 
} 

は、次にドキュメントのようにそれを登録しようとしました:

@Configuration 
public class ApplicationConfiguration { 

    @Bean 
    public HttpMessageConverters customConverters() { 
     HttpMessageConverter<Object> converter = new TextJavascriptMessageConverter(new ObjectMapper()); 
     return new HttpMessageConverters(Collections.singletonList(converter)); 
    } 
} 

はそれでも、私はCould not extract response: no suitable HttpMessageConverter found for response type [class example.MyResponsee] and content type [text/javascript]

私もMappingJackson2HttpMessageConverterを拡張しようとしましたが、それは動作しませんでしたを示すメッセージを取得しますどちらか。私は何が欠けていますか?また、このために新しいコンバータを作成するか、既存のものを変更することをお勧めしますか(最初の例で示したように)は受け入れられますか?

答えて

0

メディアタイプを明示的に指定するには、他のコンストラクタを使うべきだと思います。

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper) { 
    init(objectMapper); 
} 

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType supportedMediaType) { 
    super(supportedMediaType); 
    init(objectMapper); 
} 

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType... supportedMediaTypes) { 
    super(supportedMediaTypes); 
    init(objectMapper); 
} 
+0

これはどちらもうまくいきませんでした。 – RK1

0

ブートでピックアップし、デフォルトの上にロードされる新しいMappingJackson2HttpMessageConverter Beanを定義することができるはずです。

@Bean 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){ 
    MappingJackson2HttpMessageConverter jacksonConverter = new 
      MappingJackson2HttpMessageConverter(); 
    jacksonConverter.setSupportedMediaTypes 
      (Collections.singletonList(mediaType)); 
    return jacksonConverter; 
} 
関連する問題