一、前言
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-core
与spring-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}")