关于Spring MVC中@ResponseBody怎么知道我需要什么类型

 我来答
就烦条0o
2016-05-29 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46497
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部

@ResponseBody注解在 method上具体返回什么类型的数据流(json、xml等)主要有两个方面决定的:1. 是否有对应的第三方jar包出现在classpath,比如jackson jar、jaxb2
jar,如果只存在spring mvc就会注册对应的HttpMessageConvert(将return
obj写为response的流是靠httpMessageConvert的实现类来完成的) 2.
有@RequestMapping注解的consumes具体的mediaTypes和http请求的accept能结束的mime
type来联合决定。
有这两点决定@ResponseBody注解的返回值的返回流的类型具体的实现参见
RequestResponseBodyMthodProcessor,java中,具体的写流实现如下在
AbstractMessageConverterMethodProcessor.writeWithMessageConverters()来实现
的。具体代码:

/** 
     * Writes the given return type to the given output message. 
     * 
     * @param returnValue the value to write to the output message 
     * @param returnType the type of the value 
     * @param inputMessage the input messages. Used to inspect the {@code Accept} header. 
     * @param outputMessage the output message to write to 
     * @throws IOException thrown in case of I/O errors 
     * @throws HttpMediaTypeNotAcceptableException thrown when the conditions indicated by {@code Accept} header on 
     * the request cannot be met by the message converters 
     */  
    @SuppressWarnings("unchecked")  
    protected <T> void writeWithMessageConverters(T returnValue,  
                                                MethodParameter returnType,  
                                                ServletServerHttpRequest inputMessage,  
                                                ServletServerHttpResponse outputMessage)  
            throws IOException, HttpMediaTypeNotAcceptableException {  
  
        Class<?> returnValueClass = returnValue.getClass();  
  
        HttpServletRequest servletRequest = inputMessage.getServletRequest();  
        List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest);  
        List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass);  
  
        Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>();  
        for (MediaType r : requestedMediaTypes) {  
            for (MediaType p : producibleMediaTypes) {  
                if (r.isCompatibleWith(p)) {  
                    compatibleMediaTypes.add(getMostSpecificMediaType(r, p));  
                }  
            }  
        }  
        if (compatibleMediaTypes.isEmpty()) {  
            throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);  
        }  
  
        List<MediaType> mediaTypes = new ArrayList<MediaType>(compatibleMediaTypes);  
        MediaType.sortBySpecificityAndQuality(mediaTypes);  
  
        MediaType selectedMediaType = null;  
        for (MediaType mediaType : mediaTypes) {  
            if (mediaType.isConcrete()) {  
                selectedMediaType = mediaType;  
                break;  
            }  
            else if (mediaType.equals(MediaType.ALL) || mediaType.equals(MEDIA_TYPE_APPLICATION)) {  
                selectedMediaType = MediaType.APPLICATION_OCTET_STREAM;  
                break;  
            }  
        }  
  
        if (selectedMediaType != null) {  
            selectedMediaType = selectedMediaType.removeQualityValue();  
            for (HttpMessageConverter<?> messageConverter : messageConverters) {  
                if (messageConverter.canWrite(returnValueClass, selectedMediaType)) {  
                    ((HttpMessageConverter<T>) messageConverter).write(returnValue, selectedMediaType, outputMessage);  
                    if (logger.isDebugEnabled()) {  
                        logger.debug("Written [" + returnValue + "] as \"" + selectedMediaType + "\" using [" +  
                                messageConverter + "]");  
                    }  
                    return;  
                }  
            }  
        }  
        throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes);  
    }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式