Java 自定义PermissionEvaluation bean导致循环引用和空指针异常

Java 自定义PermissionEvaluation bean导致循环引用和空指针异常,java,spring,spring-security,Java,Spring,Spring Security,我试图在Spring4上设置SpringSecurityACL,但是我得到了一个空指针异常 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.acls.jdbc.LookupStrategy]: Circular reference involving containing bean 'webSecurityACL

我试图在Spring4上设置SpringSecurityACL,但是我得到了一个空指针异常

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.acls.jdbc.LookupStrategy]: Circular reference involving containing bean 'webSecurityACL' - consider declaring the factory method as static for independence from its containing instance. Factory method 'lookupStrategy' threw exception; nested exception is java.lang.IllegalArgumentException: DataSource required
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 95 common frames omitted
Caused by: java.lang.IllegalArgumentException: DataSource required
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.security.acls.jdbc.BasicLookupStrategy.<init>(BasicLookupStrategy.java:145)
at com.sample.application.WebSecurityACL.lookupStrategy(WebSecurityACL.java:59)
我把罪魁祸首指向了许可证评估员bean。如果我将aclService()替换为null(只是为了测试):

然后我就可以运行应用程序了。我想不出循环引用在哪里。如有任何建议,将不胜感激

这是我的gradle文件:

version '1.0-SNAPSHOT'

apply plugin: 'spring-boot'


buildscript {
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
}
}

dependencies {
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.2.RELEASE")
compile 'org.springframework.security:spring-security-acl:3.2.8.RELEASE'
compile 'net.sf.ehcache:ehcache:2.10.1'
runtime 'mysql:mysql-connector-java:5.1.36'
testCompile group: 'junit', name: 'junit', version: '4.12'
}

原因是数据源未被注入-

原因:java.lang.IllegalArgumentException:需要数据源 位于org.springframework.util.Assert.notNull(Assert.java:112) 位于org.springframework.security.acls.jdbc.BasicLookupStrategy(BasicLookupStrategy.java:145) 位于com.sample.application.WebSecurityACL.lookupStrategy(WebSecurityACL.java:59)


你能证实这一点吗?消除异常的原因是“AclPermissionEvaluator(null)”也在调用数据源,并给出了一个未捕获的异常

原因是数据源没有被注入-

原因:java.lang.IllegalArgumentException:需要数据源 位于org.springframework.util.Assert.notNull(Assert.java:112) 位于org.springframework.security.acls.jdbc.BasicLookupStrategy(BasicLookupStrategy.java:145) 位于com.sample.application.WebSecurityACL.lookupStrategy(WebSecurityACL.java:59)

你能证实这一点吗?您消除异常的原因是“AclPermissionEvaluator(null)”也在调用数据源,并给出一个未捕获的异常

如果我尝试“返回新的AclPermissionEvaluator(null)”,则数据源不再为null。如果调用aclService(),则数据源为null。我不知道为什么。我想这就是答案,如果我尝试“返回新的AclPermissionEvaluator(null)”,那么数据源就不再是null了。如果调用aclService(),则数据源为null。我不知道为什么。我想这就是答案
PermissionEvaluator permissionEvaluator(){
    return new AclPermissionEvaluator(null);
}
version '1.0-SNAPSHOT'

apply plugin: 'spring-boot'


buildscript {
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE")
}
}

dependencies {
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.2.RELEASE")
compile 'org.springframework.security:spring-security-acl:3.2.8.RELEASE'
compile 'net.sf.ehcache:ehcache:2.10.1'
runtime 'mysql:mysql-connector-java:5.1.36'
testCompile group: 'junit', name: 'junit', version: '4.12'
}