在我的Grails 2.5.1项目中,我正在使用spring-security-core:2.0-RC5插件并收到此错误:
static public class ManageData {
static Weather weather;
static public Weather getData(){
return weather;
}
static public void putData(Weather forecast) {
weather = forecast;
}
}
这是我的BootStrap:
Weather forecast = splash_activity.ManageData.getData();
我缺少什么?
答案 0 :(得分:3)
问题是def springSecurityService
的位置。正如你声明的那样,它是init
闭包的局部变量。它不是依赖注入的候选者,因此没有任何内容初始化它并且它是空的。
要使用依赖注入,请将bean声明为类范围属性,而不是局部变量(闭包或方法)。这样做的原因是Groovy编译器将属性声明转换为具有getter和setter的私有字段。 Spring没有对Groovy属性的任何支持,但是当有一个与bean名称一致的setter方法时,它可以按名称自动装配(这是Grails的默认值)。因此,由于Groovy编译器为您添加了void setSpringSecurityService(springSecurityService)
方法,所以Spring会看到它并调用它,因为方法"属性" name匹配您想要的bean。如果声明一个局部变量,则完全忽略它。
所以你的代码应该是这样的:
def springSecurityService
def init = { servletContext ->
...
}
但是接下来你会遇到代码的第二个问题。假设您尚未更改User
课程中的自动哈希逻辑,那么您将进行两次编码。一旦进入BootStrap,再次进入域类。如果你这样做,没有人能够进行身份验证。选择一个 - 显式哈希,就像您正在执行并从域类中删除代码,或保留域类代码并只设置明文密码。如果你选择选项#2,你的代码(也清理使用findOrSaveBy
并用一个替换所有那些不必要的急切同花顺)应该看起来像
class BootStrap {
def init = {
def userRole = SecurityRole.findOrSaveByAuthority('ROLE_USER')
def adminRole = SecurityRole.findOrSaveByAuthority('ROLE_ADMIN')
def user = new User(username: 'user' ,password: '123').save()
def admin = new User(username: 'admin' ,password: '1234').save()
SecurityUserSecurityRole.create(user, userRole)
SecurityUserSecurityRole.create(admin, adminRole)
User.withSession { it.flush() }
}
}
更好的方法是将此代码移至事务性服务。这留给读者练习。