zhangyanfengzi 2013-11-20 15:24 采纳率: 100%
浏览 369
已采纳

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

public @ResponseBody searchTreeDicIndustryNode(HttpServletResponse response) {
        List<Person> industries = null;

 @ResponseBody怎么知道我需要什么类型信息呢?

 

希望得到大家帮忙。谢谢。

  • 写回答

2条回答 默认 最新

  • iteye_14005 2013-11-20 23:58
    关注

    :D @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()来实现的。具体代码:
    [code="java"]/**
    * 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 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);
    }[/code]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥15 QT6颜色选择对话框显示不完整
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器