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