基于4.1.7.RELEASE
该类实现了MediaTypeFileExtensionResolver接口,那么实现根据MediaType获取后缀名的方法是必不可少了,那么它跟ContentNegotiationManager有什么区别呢?可以下面几个方法
protected List<MediaType> getAllMediaTypes() { return new ArrayList<MediaType>(this.mediaTypes.values()); } 获取所有的MediaType。 protected MediaType lookupMediaType(String extension) { return this.mediaTypes.get(extension); }
根据后缀名查找对应的MediaType。
注意上面两个方法中都用到了this.mediaTypes,这是一个ConcurrentMap,主要负责存储后缀名和MediaType的对应关系,同时还需要判断该对应关系的唯一性,通过其判断的结果来设置内部的后缀名列表,避免出现重复的情况。
protected void addMapping(String extension, MediaType mediaType) { MediaType previous = this.mediaTypes.putIfAbsent(extension, mediaType); if (previous == null) { this.fileExtensions.add(mediaType, extension); this.allFileExtensions.add(extension); } }
由此可见,采用ConcurrentMap是为了避免出现并发情况下导致的一致性问题。
解析到这里,那么这个类的作用便很好判断了。该类的作用可以描述如下
1 给你一个MediaType和后缀extension的对应列表,里面可能有重复的,你负责存起来并且保证不出现重复的extension。
2 给我找出所有的extension或者某个MediaType对应的extension。
3 给我找出所有的MediaType或者某个extension对应的MediaType。