将msgpack作为内容协商添加到spring mvc + boot

时间:2016-03-22 21:06:09

标签: java spring spring-boot jackson msgpack

我正在尝试添加msgpack二进制数据格式作为内容协商选项。 Json和Xml开箱即用。我尝试将jackson msgpack mapper添加为bean,就像在this examle中一样,但它不起作用。当我向请求to_update添加Accept: application/x-msgpack标头时,会返回代码。

这是我的WebConfig:

406 Not Acceptable

我没有为我的DTO对象添加任何特殊注释,我的控制器也没有任何异常。

我的msgpack依赖是:

@Configuration
@EnableWebMvc
@SuppressWarnings("unused")
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public HttpMessageConverter messagePackMessageConverter() {
        return new AbstractJackson2HttpMessageConverter(
                new ObjectMapper(new MessagePackFactory()),
                new MediaType("application", "x-msgpack")) {
        };
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false)
                .ignoreAcceptHeader(false)
                .favorParameter(true)
                .defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML)
                .mediaType("msgpack", new MediaType("application", "x-msgpack"));
    }

}

2 个答案:

答案 0 :(得分:1)

显然豆注射不起作用(如果有人告诉我如何自动注射新的HttpMessageConverter,我会很高兴)。所以我手动添加了它:

public class WebConfig extends WebMvcConfigurerAdapter {


    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(messagePackMessageConverter());
        converters.add(new MappingJackson2HttpMessageConverter());
        converters.add(new MappingJackson2XmlHttpMessageConverter());

        super.configureMessageConverters(converters);
    }

    //...

答案 1 :(得分:0)

可以通过两种方式完成-

  1. 使用Spring Boot只需创建HttpMessageConverter类型的@Bean即可完成这项工作。 spring boot会将其自动添加到消息转换器列表中。 (但是这样做还意味着如果没有提供Accept标头时,现有应用程序正在将“ application / json”作为默认响应返回,那么现在它将返回默认“ application / x-msgpack”)

     @Bean    
     public HttpMessageConverter messagePackMessageConverter() {
             MediaType msgPackMediaType = new MediaType("application", "x-msgpack");
             return new AbstractJackson2HttpMessageConverter(new ObjectMapper(new 
                  MessagePackFactory()), msgPackMediaType) {
             };
     }
    
  2. 此解决方案与使用WebMvcConfigurerAdapter的上述解决方案类似,但是我建议不要使用configureMessageConverters,因为使用extendMessageConverters会关闭默认的转换器注册在春天之前。用法示例-

    configureMessageConverters