spring-web源码解析之AbstractMappingContentNegotiationStrategy

简介: 基于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列表并返回。

目录
相关文章
|
2天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
16天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
26天前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
26 7

热门文章

最新文章

推荐镜像

更多