【问题标题】:Configure 2 different MessageConverters for 2 Controllers为 2 个控制器配置 2 个不同的 MessageConverters
【发布时间】:2016-04-08 11:19:34
【问题描述】:

我想为两个单独的控制器配置两个不同的 HttpMessageConverters 具有相同的 MediaType。原因是有一些外部服务使用不同的 JSON 格式。我们无法更改它们。

有可能吗?我可以创建两个WebMvcConfigurerAdapters 并以某种方式拆分流量吗?如果可能,这是一个好习惯吗?

【问题讨论】:

  • request 还是response
  • 每个请求及其响应都使用相同的 MC。但对于不同的 MC,取决于控制器/路径。
  • 我会建议与@ControllerAdvice 一起使用一些东西,但这只会处理response... :(

标签: json spring spring-mvc spring-web


【解决方案1】:

最后,我通过覆盖 MessageConverter 添加了配置其 jaxbcontext 并分配支持的包的可能性来解决问题。因此,我可以为同一个控制器创建 2 个不同的 MessageConverters,并根据返回类使用一个或另一个。

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);
  }
}

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多