关于ResponseBody注解

@ResponseBody注解时: 根据Request对象header部分的Accept属性,逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter


private void writeWithMessageConverters(Object returnValue,
                HttpInputMessage inputMessage, HttpOutputMessage outputMessage)
                throws IOException, HttpMediaTypeNotAcceptableException {
            List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
            if (acceptedMediaTypes.isEmpty()) {
                acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
            }
            MediaType.sortByQualityValue(acceptedMediaTypes);
            Class<?> returnValueType = returnValue.getClass();
            List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>();
            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());
                }
            }
            throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes);
        }


如果 @ResquestMapping中指明了produces={"application/json"}那么ResponseBody会自动加上Content-Type为application/json

如果@ResquestMapping中未指明produces类型,则ResponseBody会根据request中accept的值来作为Content-Type


如果不写@ResponseBody而且返回值是String类型的话,那么SpringMVC会把这个返回值当做View页面去查找,出现404错误


为了避免出现乱码,建议指定生产编码produces = {"application/json;charset=UTF-8"})

猜你喜欢

转载自blog.csdn.net/javaer_lee/article/details/52529521