Spring将ProtobufHttpMessageConverter添加到没有xml配置的控制器

时间:2015-08-11 21:48:37

标签: java spring spring-mvc

这应该非常简单,但我无法确定如何为Spring控制器添​​加ProtobufHttpMessageConverter,同时保持默认HttpMessageConverters

我设置了客户端(RestTemplate)但是我发送的每个请求都有错误415 :内容不受支持。

到目前为止,我发现的每个示例都指的是Spring Boot或XML配置,但这些都不适用于我。

answer关于类似问题, 扩展WebMvcConfigurerAdapter显然会删除默认处理程序。

声明扩展WebMvcConfigurationSupport以保留默认处理程序,但由于方法调用super.addDefaultHttpMessageConverters();需要转换器列表,因此实现对Spring 4x不起作用。

我在主题上尝试了variantions但似乎都没有效果:

@EnableWebMvc
@Configuration
@ComponentScan

public class RestServiceConfiguration extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    converters.add(new ProtobufHttpMessageConverter());

    // getMessageConverters().add(new ProtobufHttpMessageConverter());
    // super.configureMessageConverters(getMessageConverters());
    super.addDefaultHttpMessageConverters(converters);
    }
}

在没有xml配置的情况下,有人可以帮我添加ProtobufHttpMessageConverter同时保留默认转换器吗?

1 个答案:

答案 0 :(得分:4)

通过您的方法,您可以使其发挥作用。但是,由于您延长了WebMvcConfigurationSupport并使用了@EnableWebMvc,因此无法使用。您基本上是在配置网络支持两次,因为@EnableWebMvc正在导入WebMvcConfigurationSupport(实际上是DelegatingWebMvcConfiguration)。

要使当前设置正常,请删除@EnableWebMvc注释。

@Configuration
@ComponentScan
public class RestServiceConfiguration extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new ProtobufHttpMessageConverter());
        super.addDefaultHttpMessageConverters(converters);
    }
}

然而,有一种更好的方法,而不是扩展WebMvcConfigurationSupport,您应该扩展WebMvcConfigurerAdapter并实施extendMessageConverters方法而不是configureMessageConverters

@EnableWebMvc
@Configuration
@ComponentScan
public class RestServiceConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        converters.add(new ProtobufHttpMessageConverter());
    }
}

注意: Spring 4.1.3中添加了extendMessageConverters方法,早期版本使用第一种方法!