DefaultConversionService.getSharedInstance()报错NoSuchMethodError的解决方法

一、前言

spring项目,新增了一个工具方法,要用到这2个类:

import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.StandardPasswordEncoder;

想要使用这2个类,就需要引入spring-security-core这个jar包,pom.xml中增加了:

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>4.2.2.RELEASE</version>
		</dependency>

结果,启动项目就报错了:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'staticPropertiesUtil': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.List com.xxx.StaticPropertiesUtil.xssFilterWhiteUrlList; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.getSharedInstance()Lorg/springframework/core/convert/ConversionService;

其中,主要错误是:

java.lang.NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.getSharedInstance()Lorg/springframework/core/convert/ConversionService;

二、解决过程

1.百度发现,可能是spring-security-corespring-core版本冲突导致的;
本人项目中,spring-core的版本是4.2.5.RELEASE,spring-security-core的版本是4.2.2.RELEASE

尝试更换jar包版本,没有用;

最后排查发现,不是jar包冲突的问题。

2.(1)再次分析错误信息,发现是某个类报错Could not autowire field,是StaticPropertiesUtil.java中有个变量xssFilterWhiteUrlList注入失败了;(这个类是自己写的一个工具类)

其中代码如下:

public class StaticPropertiesUtil implements InitializingBean {

    //白名单,用分号分隔,可配置多个
    @Value("#{'${xssFilter.white.url.list}'.split(';')}")
    private List<String> xssFilterWhiteUrlList;
    
    //静态变量,供其它类使用
    public static List<String> xssFilterWhiteUrlList_static;

    //项目启动后,会执行这个方法,这个静态变量就可以供其它类使用了
    @Override
    public void afterPropertiesSet() throws Exception {
        xssFilterWhiteUrlList_static = xssFilterWhiteUrlList;
    }
}

这个变量,对应的application.properties内容为:

xssFilter.white.url.list=/save;/update

意思就是把properties里配置的内容转为List<String>类型的变量,按分号分隔,供后续使用。

(2)测试发现,引入spring-security-core包之前,这样写是没有问题的;但是引入spring-security-core包后,就会报错java.lang.NoSuchMethodError

(3)最后,发现把这段代码修改如下,就不报错了:

public class StaticPropertiesUtil implements InitializingBean {

    //白名单,用分号分隔,可配置多个
    @Value("${xssFilter.white.url.list}")
    private String xssFilterWhiteUrlList;
    //静态变量,供其它类使用
    public static List<String> xssFilterWhiteUrlList_static;

    @Override
    public void afterPropertiesSet() throws Exception {
        xssFilterWhiteUrlList_static = Arrays.asList(xssFilterWhiteUrlList.split(";"));
    }
}

三、总结

spring项目里,引入spring-security-core这个jar包后,有可能会导致以下语句无法使用,报错java.lang.NoSuchMethodError

@Value("#{'${properties.value}'.split(';')}")

此时,可以选择改为以下语句:

@Value("${properties.value}")

猜你喜欢

转载自blog.csdn.net/BHSZZY/article/details/128453895