我想将自定义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>
注意:
当服务器启动时,调用了configureMessageConverters方法。 (断点确认)
我正在为JSONP使用AbstractJsonpResponseBodyAdvice子类 (我删除了这个课程,但没有任何改变。)
我在下面用作参考。
http://www.baeldung.com/spring-httpmessageconverter-rest
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);
}
}
在每种情况下我都没有错误。但是定制不起作用。
答案 0 :(得分:0)
在configureMessageConverters方法中,如果没有覆盖并且没有添加其他转换器,转换器为空,WebMvcConfigurationSupport将调用addDefaultHttpMessageConverters,它将配置默认转换器,其中包含默认的MappingJackson2HttpMessageConverter。
因此在extendMessageConverters中添加MappingJackson2HttpMessageConverter将无效。
有两种解决方案:
您在configureMessageConverters方法本身中添加了所需的转换器
要确定extendMessageConverters中的转换器类型,请设置所需的属性
答案 1 :(得分:0)
我也遇到了这个问题,并且由于另一个站点而发现了这个问题:
@EnableWebMvc等效于基于XML的配置。
如果您同时拥有,则extendMessageConverters似乎无效。删除XML条目后,bingo ..自定义转换器开始工作。