spring多版本整合

在旧工程中,尝试将Spring从2.0版本升级到4.1.6.RELEASE,引入rest-template相关jar包后,启动时遇到报错。原因是4.1.6版本的`HierarchicalUriComponents`使用了未在2.0版本`CollectionUtils`中存在的`unmodifiableMultiValueMap`方法。解决方法是在spring-web-4.1.6.RELEASE.jar的MANIFEST.MF文件中,添加Class-Path指向spring-core-4.1.6.RELEASE.jar,确保正确版本的类被加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题现象:

旧工程中的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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值