Grails Spring Security Plugin扩展了User类构造函数而没有设置字段值

时间:2013-12-07 05:48:42

标签: grails spring-security

我的应用程序有两种类型的用户(讲师和学生)。

我已将firstName和lastName字段添加到Spring Security Plugin生成的User类中,因为所有用户都应该拥有名字和姓氏。我将“用户”子类化为“讲师”和“学生”来代表我的两种类型的用户。教师和学生是Grails Domain Classes。

我在Bootstrap.groovy中创建测试用户。我可以毫无问题地创建一个新的“用户”对象。

当我尝试创建一个新的'Student'或'Instructor'对象时,firstName和lastName字段在通过构造函数设置时为null。

Spring Security Plugin用户类:

class User {
    transient springSecurityService

    String firstName
    String lastName
    String username
    String password
    ...
}

学生班:

class Student extends User{
    String grade
}

这有效--Bootstrap.groovy:

def myUser = new User(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones')
printLn "Last name is ${myUser.lastName}"

按预期将Last name is Jones打印到控制台。

如果我尝试对'Student'子类做同样的事 - Bootstrap.groovy:

def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
printLn "Last name is ${myUser.lastName}"

Last name is null打印到控制台而不是我的预期!

我尝试使用普通的vanilla域类(不是User类),我没有问题。作为Spring Security初始化的一部分,我觉得“User”类发生了一些特殊的事情,它阻止了子类设置超级属性但我找不到任何文档。

我可以通过在初始化子类后设置属性来解决它,但我不确定这是否正确 - Bootstrap.groovy:

def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
myUser.lastName = "Woot"
printLn "Last name is ${myUser.lastName}"

按预期在控制台中打印Last name is Woot

有人可以解释为什么会这样吗?我有更好的方法来管理我的域模型吗?

0 个答案:

没有答案