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条)

报告相同问题?

悬赏问题

  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了