SpringMVC架构代码解析之MediaTypeFileExtensionResolver

原创 码农  2019-12-27 10:54:37  阅读 340 次 评论 0 条

源码解析


SpringMVC架构代码解析之MediaTypeFileExtensionResolver SpringMVC架构代码解析之MediaTypeFileExtensionResolver 架构


org.springframework.web.accept.MediaTypeFileExtensionResolver 将媒体类型解析为文件扩展名列表的策略。例如,将“application/json”解析为“json”。


org.springframework.web.accept.MappingMediaTypeFileExtensionResolver ediaTypeFileExtensionResolver的实现,它在两个方向上维护文件扩展名和媒体类型之间的查找。最初使用文件扩展名和媒体类型的映射创建。随后子类可以使用addMapping来添加更多的映射。

private final ConcurrentMap<String, MediaType> mediaTypes =
      new ConcurrentHashMap<String, MediaType>(64);

mediaTypes

org.springframework.web.accept.ContentNegotiationStrategy 用于解析请求的请求媒体类型的策略。这里是策略模式实现。

List<MediaType> resolveMediaTypes(NativeWebRequest webRequest)  throws HttpMediaTypeNotAcceptableException;

将给定的请求解析为媒体类型列表。返回的列表首先按照特殊性排序,然后按照质量参数排序。


org.springframework.web.accept.AbstractMappingContentNegotiationStrategy 用于contentnegotiation策略实现的基类,其中包含将请求解析为媒体类型的步骤。首先是一把钥匙。必须从请求(例如文件扩展名、查询参数)中提取“json”、“pdf”。然后,必须通过存储此类映射的基类MappingMediaTypeFileExtensionResolver将键解析为媒体类型。handleNoMatch方法允许子类插入查找媒体类型的其他方法(例如,通过Java激活框架,或者javax.servlet.ServletContext.getMimeType)。然后将通过基类解析的媒体类型添加到基类MappingMediaTypeFileExtensionResolver中,即缓存以进行新查找。


org.springframework.web.accept.AbstractMappingContentNegotiationStrategy#resolveMediaTypes 解析medisType

@Override
  public List<MediaType> resolveMediaTypes(NativeWebRequest webRequest)
      throws HttpMediaTypeNotAcceptableException {

//    模板方法
    return resolveMediaTypeKey(webRequest, getMediaTypeKey(webRequest));
  }

这里是模板方法实现。org.springframework.web.accept.AbstractMappingContentNegotiationStrategy#getMediaTypeKey 从请求中提取用于查找媒体类型的键。需要子类实现这个模板方法。


org.springframework.web.accept.AbstractMappingContentNegotiationStrategy#handleMatch 覆盖,以便在通过lookupMediaType成功解析密钥时提供处理。

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

子类需要实现这个模板方法。


org.springframework.web.accept.PathExtensionContentNegotiationStrategy 一个contentnegotiation策略,它将请求路径中的文件扩展名解析为用于查找媒体类型的键。如果在提供给构造函数的显式注册中没有找到文件扩展名,则使用Java激活框架(Java Activation Framework, JAF)作为回退机制。

JAF的存在会被自动检测并启用,但是setUseJaf(boolean)属性可能被设置为false。


org.springframework.web.accept.ParameterContentNegotiationStrategy 将查询参数解析为用于查找媒体类型的键的contentnegotiation策略。默认参数名是format。


org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy

private final ServletContext servletContext;

servletContext


org.springframework.web.accept.HeaderContentNegotiationStrategy header context策略实现。


org.springframework.web.accept.FixedContentNegotiationStrategy 固定content策略实现。


org.springframework.web.accept.ContentNegotiationManager 类确定请求的请求媒体类型。这是通过委托给一个已配置contentnegotiation策略实例的列表来实现的。还提供查找媒体类型的文件扩展名的方法。这是通过委托给已配置的MediaTypeFileExtensionResolver实例列表来完成的。

private final List<ContentNegotiationStrategy> strategies = new ArrayList<ContentNegotiationStrategy>();

strategies

private final Set<MediaTypeFileExtensionResolver> resolvers = new LinkedHashSet<MediaTypeFileExtensionResolver>();

resolvers


说在最后

本次解析仅代表个人观点,仅供参考。


本文地址:https://www.itcodeit.com/post/31.html
版权声明:本文为原创文章,版权归 码农 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?