2016-04-08 6 views
1

別の2つのコントローラに対して同じMediaTypeを持つ2つの異なるHttpMessageConvertersを設定したいと思います。その理由は、異なるJSON形式を使用する外部サービスがいくつかあるからです。我々はそれらを変更することはできません。2つのコントローラ用に2つの異なるMessageConvertersを設定してください

可能ですか? 2つのWebMvcConfigurerAdaptersを作成し、トラフィックを何とか分割できますか?可能であれば、それは良い習慣ですか?

+0

は、それは 'request'または' response'のためですか? –

+0

すべての要求とその応答に同じMCがあります。しかしコントローラ/パスに応じて異なるMCのために。 –

+0

私は@ControllerAdvice'と一緒に何かを使うことを提案しようとしていましたが、それは 'response'を処理するだけでした。:( –

答えて

0

最後に、MessageConverterをオーバーライドしてjaxbcontextを構成し、サポートされているパッケージを割り当てる可能性を追加して問題を解決しました。だから、私は同じコントローラのための2つの異なるMesssageConvertersを作成することができ、戻りクラスに応じて、どちらかを使用します。

public class MoxyMessageConverter extends AbstractHttpMessageConverter<Object> { 

    private final JAXBContext jAXBContext; 

    private String[] supportedPackages = { ... }; // some defaults 

    public MoxyMessageConverter(JAXBContext jAXBContext) { 
    this.jAXBContext = jAXBContext; 
    } 

    public String[] getSupportedPackages() { 
    return supportedPackages; 
    } 

    public void setSupportedPackages(String[] supportedPackages) { 
    this.supportedPackages = supportedPackages; 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
    String packageName = clazz.getPackage().getName(); 
    for (String supportedPackage : supportedPackages) { 
     if (packageName.startsWith(supportedPackage)) 
     return true; 
    } 
    return false; 
    } 

@Override 
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
.. 
} 

@Override 
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 
.. 
} 
} 

と@Configurationクラスで:

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 
    super.extendMessageConverters(converters); 
    MoxyMessageConverter defaultMessageConverter = new MoxyMessageConverter(defaultJAXBContext); 
    defaultMessageConverter.setSupportedPackages(new String[] { "xxx.xxx.xxx.webservices" }); 
    converters.add(0, defaultMessageConverter); 

    MoxyMessageConverter payUMessageConverter = new MoxyMessageConverter(payUJAXBContext); 
    payUMessageConverter.setSupportedPackages(new String[] { "xxx.xxx.xxx.webservices.payu" }); 
    converters.add(0, payUMessageConverter); 
    } 
} 
関連する問題