在springmvc3里面,使用@ResponseBody和jackson下的jar包,可以直接将各种对象转换成json对象,这其中具体是怎么实现的。
求指导。
这个过程最好自己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);
基本就是这样一个过程
[code="java"]Jackson 是一个 Java 用来处理 JSON 格式数据的类库
可以 对象-》json json-对象==
@ResponseBody是spring的注解啊
表示该方法的返回结果直接写入HTTP response body中
这个很明了啊
[/code]