在springmvc3里面,使用@ResponseBody和jackson下的jar包,可以直接将各种对象转换成json对象,这其中具体是怎么实现的。
求指导。
SpringMVC3 和 json 的问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
tianshilang 2012-01-05 11:13关注这个过程最好自己debug跟踪一下
具体执行路线AnnotationMethodHandlerAdapter->handle()->invokeHandlerMethod()->
[code="java"]
else if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBody.class) != null) {
handleResponseBody(returnValue, webRequest);
return null;
}
[/code][code="java"]
private void handleResponseBody(Object returnValue, ServletWebRequest webRequest)
throws Exception {
if (returnValue == null) {
return;
}
HttpInputMessage inputMessage = createHttpInputMessage(webRequest);
HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest);
writeWithMessageConverters(returnValue, inputMessage, outputMessage);
}
[/code][code="java"]
List allSupportedMediaTypes = new ArrayList();
if (getMessageConverters() != null) {
for (MediaType acceptedMediaType : acceptedMediaTypes) {
for (HttpMessageConverter messageConverter : getMessageConverters()) {
if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
messageConverter.write(returnValue, acceptedMediaType, outputMessage);
if (logger.isDebugEnabled()) {
MediaType contentType = outputMessage.getHeaders().getContentType();
if (contentType == null) {
contentType = acceptedMediaType;
}
logger.debug("Written [" + returnValue + "] as \"" + contentType +
"\" using [" + messageConverter + "]");
}
this.responseArgumentUsed = true;
return;
}
}
}
for (HttpMessageConverter messageConverter : messageConverters) {
allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());
}
}
[/code]具体在MappingJacksonHttpMessageConverter中,首先用canWrite判断是否能用json来转换
return this.objectMapper.canSerialize(clazz) && canWrite(mediaType);基本就是这样一个过程
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报