美文网首页
springMVC406分析

springMVC406分析

作者: 给时光生命 | 来源:发表于2018-09-25 09:48 被阅读12次

    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#getProducibleMediaTypes(javax.servlet.http.HttpServletRequest, java.lang.Class<?>, java.lang.reflect.Type)
    request

    获取HttpMessageConverter的MediaTypes

    protected List<MediaType> getProducibleMediaTypes(HttpServletRequest request, Class<?> valueClass, Type declaredType) {
            Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
            if (!CollectionUtils.isEmpty(mediaTypes)) {
                return new ArrayList<MediaType>(mediaTypes);
            }
            else if (!this.allSupportedMediaTypes.isEmpty()) {
                List<MediaType> result = new ArrayList<MediaType>();
                for (HttpMessageConverter<?> converter : this.messageConverters) {
                    if (converter instanceof GenericHttpMessageConverter && declaredType != null) {
                        if (((GenericHttpMessageConverter<?>) converter).canWrite(declaredType, valueClass, null)) {
                            result.addAll(converter.getSupportedMediaTypes());
                        }
                    }
                    else if (converter.canWrite(valueClass, null)) {
                        result.addAll(converter.getSupportedMediaTypes());
                    }
                }
                return result;
            }
            else {
                return Collections.singletonList(MediaType.ALL);
            }
        }
    

    request和返回mediaType对比

    List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
            List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);
    
            if (outputValue != null && producibleMediaTypes.isEmpty()) {
                throw new IllegalArgumentException("No converter found for return value of type: " + valueType);
            }
    
            Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>();
            for (MediaType requestedType : requestedMediaTypes) {
                for (MediaType producibleType : producibleMediaTypes) {
                    if (requestedType.isCompatibleWith(producibleType)) {
                        compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType));
                    }
                }
            }
            if (compatibleMediaTypes.isEmpty()) {
                if (outputValue != null) {
                    throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);
                }
                return;
            }
    

    相关文章

      网友评论

          本文标题:springMVC406分析

          本文链接:https://www.haomeiwen.com/subject/pmykoftx.html