SpringMVC Jackson2HttpMessageConverter自定义不起作用

时间:2015-07-06 13:57:46

标签: java spring spring-mvc jackson

我想将自定义JsonSerializer用于SpringMVC4的JSON响应。

为了添加JsonSerializer,我创建了WebMvcConfigurerAdapter子类。 但是MappingJackson2HttpMessageConverter的自定义不起作用。

简化问题,我尝试了setJsonPrefix。 但它也没有用。答复没有改变。

我的代码如下。请告诉我有什么问题。

ControllerClass

@Controller
public class SampleController {

    @RequestMapping("/sample")
    @ResponseBody
    public ResponseModel action() {
        return new ResponseModel();
    }

    public static class ResponseModel {
        public String id = "001";
        public String text = "aaa";
    }
}

配置

@Configuration
@EnableWebMvc
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

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

    @Bean
    protected MappingJackson2HttpMessageConverter converter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setJsonPrefix("prefix");
        return converter;
    }
}

调度-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    xmlns:aop="http://www.springframework.org/schema/aop">


    <!-- base package -->
    <context:annotation-config />
    <context:component-scan base-package="jp.co.xxx.*" /><!-- my package. contains WebMvcConfiguration class -->

    <annotation-driven />

    <!-- aop -->
    <aop:aspectj-autoproxy />

</beans:beans>

注意:

  1. 当服务器启动时,调用了configureMessageConverters方法。 (断点确认)

  2. 我正在为JSONP使用AbstractJsonpResponseBodyAdvice子类 (我删除了这个课程,但没有任何改变。)

  3. 我在下面用作参考。

  4. How to configure MappingJacksonHttpMessageConverter while using spring annotation-based configuration?

    http://www.baeldung.com/spring-httpmessageconverter-rest

    1. SpringMVC版本为4.1.6
    2. P.S。 在JSONSerializer中,案例如下。

      @Configuration
      @EnableWebMvc
      public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
      
          @Autowired
          protected CustomObjectMapper mapper;
      
          @Override
          public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
              converters.add(converter());
              super.configureMessageConverters(converters);
          }
      
          @Bean
          protected MappingJackson2HttpMessageConverter converter() {
              MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
              converter.setObjectMapper(mapper);
              return converter;
          }
      }
      

      ObjectMapper

      @Component
      public class CustomObjectMapper extends ObjectMapper {
          private static final long serialVersionUID = -6987863269632420904L;
      
          public CustomObjectMapper() {
              setSerializationInclusion(Include.NON_NULL);
              enable(SerializationFeature.INDENT_OUTPUT);
      
              SimpleModule module = new SimpleModule();
              module.addSerializer(DateTime.class, new DateTimeSerializer());
              registerModule(module);
          }
      }
      

      在每种情况下我都没有错误。但是定制不起作用。

2 个答案:

答案 0 :(得分:0)

在configureMessageConverters方法中,如果没有覆盖并且没有添加其他转换器,转换器为空,WebMvcConfigurationSupport将调用addDefaultHttpMessageConverters,它将配置默认转换器,其中包含默认的MappingJackson2HttpMessageConverter。

因此在extendMessageConverters中添加MappingJackson2HttpMessageConverter将无效。

有两种解决方案:

  1. 您在configureMessageConverters方法本身中添加了所需的转换器

  2. 要确定extendMessageConverters中的转换器类型,请设置所需的属性

  3. 抱歉,我说英语坏了。

答案 1 :(得分:0)

我也遇到了这个问题,并且由于另一个站点而发现了这个问题:

@EnableWebMvc等效于基于XML的配置。

如果您同时拥有,则extendMessageConverters似乎无效。删除XML条目后,bingo ..自定义转换器开始工作。