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