我的应用程序有两种类型的用户(讲师和学生)。
我已将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
。
有人可以解释为什么会这样吗?我有更好的方法来管理我的域模型吗?