【发布时间】:2015-09-23 17:09:02
【问题描述】:
我想为 SpringMVC4 的 JSON 响应使用自定义 JsonSerializer。
为了添加 JsonSerializer,我创建了 WebMvcConfigurerAdapter 子类。 但是 MappingJackson2HttpMessageConverter 的自定义不起作用。
简化问题,我试过setJsonPrefix。 但它也没有奏效。响应没有改变。
我的代码如下。请告诉我有什么问题。
控制器类
@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;
}
}
dispatcher-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
- SpringMVC 版本为 4.1.6
附: 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;
}
}
对象映射器
@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);
}
}
在每种情况下,我都没有错误。但是自定义不起作用。
【问题讨论】:
-
你在哪里用的,能不能把应该修改的错误日志或者响应贴一下。
-
您是否尝试过删除配置中的@EnableWebMvc?
-
我尝试删除@EnableWebMvc。在那种情况下,我使用了 WebMvcConfigurationSupport 而不是 WebMvcConfigurerAdapter。
-
以上代码没有使用 JSONSerializer。实际上,我将 CustomObjectMapper 设置为 MappingJackson2HttpMessageConverter。上述代码的响应是 {"id":"001","text":"aaa"}。我没有错误。但是响应没有 JsonPrefix。
-
我使用 JSONSerializer 添加了代码。
标签: java spring spring-mvc jackson