spring-web源码解析之AbstractMappingContentNegotiationStrategy

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 基于4.1.7.RELEASE 该类是一个虚基类,ParameterContentNegotiationStrategy,PathExtensionContentNegotiationStrategy,ServletPathExtensionContentNegotiationStrategy都是从该类派生出来的,我们来看类的主要几个代码。

基于4.1.7.RELEASE

该类是一个虚基类,ParameterContentNegotiationStrategy,PathExtensionContentNegotiationStrategy,ServletPathExtensionContentNegotiationStrategy都是从该类派生出来的,我们来看类的主要几个代码。

@Override
public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest) throws HttpMediaTypeNotAcceptableException {
    //1. 根据子类的实现获取不同的key 
    String key = getMediaTypeKey(webRequest);
    if (org.springframework.util.StringUtils.hasText(key)) {
        //查找构造函数传递进来的MediaType列表中 对应extension的MediaType.
        MediaType mediaType = lookupMediaType(key);
        if (mediaType != null) {
            //2. 回调
            handleMatch(key, mediaType);
            return Collections.singletonList(mediaType);
        }
        //3. 回调
        mediaType = handleNoMatch(webRequest, key);
        if (mediaType != null) {
            //保存到 MediaType 和 extensions的mapping中.
            addMapping(key, mediaType);
            return Collections.singletonList(mediaType);
        }
    }
    return Collections.emptyList();
}

其中1. 由其子类决定,可能是根据参数判断,或是根据path判段出扩展名extension。

2和3都是回调,由子类实现,分别对应找到和未找到mediaType时的对应策略,作为策略中的一种back up方案。

子类可以实现下面3个方法,其中getMediaTypeKey为阻断性的,必须实现。

protected abstract String getMediaTypeKey(NativeWebRequest request);

protected void handleMatch(String mappingKey, MediaType mediaType) {
}

protected MediaType handleNoMatch(NativeWebRequest request, String key) throws HttpMediaTypeNotAcceptableException {
   return null;
}

总结 : 该类通过request获取MediaType所需的Key,再根据Key找出对应的MediaType列表并返回。

目录
相关文章
|
20小时前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
20小时前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
1天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
7 0
|
1天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
11 0
|
1天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
9 0
|
1月前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
45 1
|
5天前
|
设计模式 测试技术 持续交付
开发复杂Web应用程序
【10月更文挑战第3天】开发复杂Web应用程序
14 2
|
7天前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
21 3
|
1月前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
74 8
只需四步,轻松开发三维模型Web应用
|
25天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
92 6

推荐镜像

更多