问题现象:
旧工程中的spring为2.0版本,为了整合RestTemplate需要引入spring-web-4.1.6.RELEASE.jar和spring-core-4.1.6.RELEASE.jar,启动过程发起报错,如下:
Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.util.CollectionUtils.unmodifiableMultiValueMap(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap; at org.springframework.web.util.HierarchicalUriComponents.<init>(HierarchicalUriComponents.java:84) at org.springframework.web.util.UriComponentsBuilder.build(UriComponentsBuilder.java:343) at org.springframework.web.util.UriComponentsBuilder.build(UriComponentsBuilder.java:327) at org.springframework.web.util.UriTemplate.<init>(UriTemplate.java:69) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:537) at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:340) at com.dev.ITSMgetitsmmenucacheAction.main(ITSMgetitsmmenucacheAction.java:89) |
原因:
spring-web-4.1.6.RELEASE.jar中的org.springframework.web.util.HierarchicalUriComponents会引用spring中的org.springframework.util.CollectionUtils的
unmodifiableMultiValueMap函数
HierarchicalUriComponents(String scheme, String userInfo, String host, String port, PathComponent path, MultiValueMap<String, String> queryParams, String fragment, boolean encoded, boolean verify) { super(scheme, fragment); this.userInfo = userInfo; this.host = host; this.port = port; this.path = (path != null ? path : NULL_PATH_COMPONENT); this.queryParams = CollectionUtils.unmodifiableMultiValueMap(queryParams != null ? queryParams : new LinkedMultiValueMap(0)); this.encoded = encoded; if (verify) verify(); } |
public static <K, V> MultiValueMap<K, V> unmodifiableMultiValueMap(MultiValueMap<? extends K, ? extends V> map) { Assert.notNull(map, "'map' must not be null"); Map result = new LinkedHashMap(map.size()); for (Map.Entry entry : map.entrySet()) { List values = Collections.unmodifiableList((List)entry.getValue()); result.put(entry.getKey(), values); } Map unmodifiableMap = Collections.unmodifiableMap(result); return toMultiValueMap(unmodifiableMap); } |
但因为工程中存在spring2.0和4.0,而优先被找到的是2.0版本的CollectionUtils,2.0版本中的CollectionUtils并没有加入unmodifiableMultiValueMap 函数,导致出错。
解决办法:
修改spring-web-4.1.6.RELEASE.jar包META-INF目录下的MANIFEST.MF文件,加入Class-Path: spring-core-4.1.6.RELEASE.jar,以改变class的查找顺序。
修改前 | Manifest-Version: 1.0 Created-By: 1.8.0_40 (Oracle Corporation) Implementation-Title: spring-web Implementation-Version: 4.1.6.RELEASE |
修改后 | Manifest-Version: 1.0 Class-Path: spring-core-4.1.6.RELEASE.jar Created-By: 1.8.0_40 (Oracle Corporation) Implementation-Title: spring-web Implementation-Version: 4.1.6.RELEASE |