Spring mvc之RequestMappingInfo类
  wppYuBI3bZta 2023年12月12日 51 0

Spring mvc之RequestMappingInfo类_类方法

请求映射信息。封装以下请求映射条件:

  1. PatternsRequestCondition
  2. RequestMethodsRequestCondition
  3. ParamsRequestCondition
  4. HeadersRequestCondition
  5. ConsumesRequestCondition
  6. ProducesRequestCondition
  7. RequestCondition (optional, custom request condition)

1. 参数说明

@Nullable
    private final String name;

    private final PatternsRequestCondition patternsCondition;

    private final RequestMethodsRequestCondition methodsCondition;

    private final ParamsRequestCondition paramsCondition;

    private final HeadersRequestCondition headersCondition;

    private final ConsumesRequestCondition consumesCondition;

    private final ProducesRequestCondition producesCondition;

    private final RequestConditionHolder customConditionHolder;

    private final int hashCode;

1.1 属性name

这个映射对象的名字

1.2 属性patternsCondition

此RequestMappingInfo对象的URL模式

Spring mvc之RequestMappingInfo类_类方法_02

如图所示该对象的patterns属性是一个Set接口实现类,保存了当前请求访问路径。

1.3 属性methodsCondition

此RequestMappingInfo的HTTP请求方法;

Spring mvc之RequestMappingInfo类_构造方法_03

该属性methods集合中存储了请求类型的枚举信息。

1.4 属性paramsCondition

此RequestMappingInfo的“参数”条件

1.5 属性headersCondition

此RequestMappingInfo的“headers”条件;

1.6 属性consumesCondition

1.7 属性customConditionHolder

2. 方法说明

构造方法有3个,如下所示:

public RequestMappingInfo(@Nullable String name, @Nullable PatternsRequestCondition patterns,
            @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
            @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
            @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom) ;

public RequestMappingInfo(@Nullable PatternsRequestCondition patterns,
            @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
            @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
            @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom);

public RequestMappingInfo(RequestMappingInfo info, @Nullable RequestCondition<?> customRequestCondition);

完整的构造方法业务代码如下:

public RequestMappingInfo(@Nullable String name, @Nullable PatternsRequestCondition patterns,
            @Nullable RequestMethodsRequestCondition methods, @Nullable ParamsRequestCondition params,
            @Nullable HeadersRequestCondition headers, @Nullable ConsumesRequestCondition consumes,
            @Nullable ProducesRequestCondition produces, @Nullable RequestCondition<?> custom) {

        this.name = (StringUtils.hasText(name) ? name : null);
        this.patternsCondition = (patterns != null ? patterns : EMPTY_PATTERNS);
        this.methodsCondition = (methods != null ? methods : EMPTY_REQUEST_METHODS);
        this.paramsCondition = (params != null ? params : EMPTY_PARAMS);
        this.headersCondition = (headers != null ? headers : EMPTY_HEADERS);
        this.consumesCondition = (consumes != null ? consumes : EMPTY_CONSUMES);
        this.producesCondition = (produces != null ? produces : EMPTY_PRODUCES);
        this.customConditionHolder = (custom != null ? new RequestConditionHolder(custom) : EMPTY_CUSTOM);

        this.hashCode = calculateHashCode(
                this.patternsCondition, this.methodsCondition, this.paramsCondition, this.headersCondition,
                this.consumesCondition, this.producesCondition, this.customConditionHolder);
    }

3. 匹配

3.1 匹配调用栈

AbstractHandlerMethodMapping方法

private void addMatchingMappings(Collection<T> mappings, List<Match> matches, HttpServletRequest request) {
        for (T mapping : mappings) {
            T match = getMatchingMapping(mapping, request);
            if (match != null) {
                matches.add(new Match(match, this.mappingRegistry.getMappings().get(mapping)));
            }
        }
    }

RequestMappingInfoHandlerMapping类方法

@Override
    protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) {
        return info.getMatchingCondition(request);
    }

3.2 匹配业务具体实现

检查此请求映射信息中的所有条件是否与提供的请求匹配,并返回一个可能的新请求映射信息,其中包含为当前请求定制的条件。
例如,返回的实例可能包含与当前请求匹配的URL模式的子集,并在顶部按最佳匹配模式排序。
返回:如果匹配,则为新实例;否则为空。

@Override
    @Nullable
    public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
        RequestMethodsRequestCondition methods = this.methodsCondition.getMatchingCondition(request);
        if (methods == null) {
            return null;
        }
        ParamsRequestCondition params = this.paramsCondition.getMatchingCondition(request);
        if (params == null) {
            return null;
        }
        HeadersRequestCondition headers = this.headersCondition.getMatchingCondition(request);
        if (headers == null) {
            return null;
        }
        ConsumesRequestCondition consumes = this.consumesCondition.getMatchingCondition(request);
        if (consumes == null) {
            return null;
        }
        ProducesRequestCondition produces = this.producesCondition.getMatchingCondition(request);
        if (produces == null) {
            return null;
        }
        PathPatternsRequestCondition pathPatterns = null;
        if (this.pathPatternsCondition != null) {
            pathPatterns = this.pathPatternsCondition.getMatchingCondition(request);
            if (pathPatterns == null) {
                return null;
            }
        }
        PatternsRequestCondition patterns = null;
        if (this.patternsCondition != null) {
            patterns = this.patternsCondition.getMatchingCondition(request);
            if (patterns == null) {
                return null;
            }
        }
        RequestConditionHolder custom = this.customConditionHolder.getMatchingCondition(request);
        if (custom == null) {
            return null;
        }
        return new RequestMappingInfo(
                this.name, pathPatterns, patterns, methods, params, headers, consumes, produces, custom);
    }

4. Match类

AbstractHandlerMethodMapping类中的私有内部类,围绕匹配的HandlerMethod及其映射的瘦包装,用于在当前请求的上下文中将最佳匹配与比较器进行比较。

private class Match {

        private final T mapping;

        private final HandlerMethod handlerMethod;

        public Match(T mapping, HandlerMethod handlerMethod) {
            this.mapping = mapping;
            this.handlerMethod = handlerMethod;
        }

        @Override
        public String toString() {
            return this.mapping.toString();
        }
    }


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月12日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   14   0   0 ideciciMaxideMax
wppYuBI3bZta