Grails Spring安全插件扩展用户类构造函数未设置字段值

Grails Spring安全插件扩展用户类构造函数未设置字段值,grails,spring-security,Grails,Spring Security,我的应用程序有两种类型的用户(讲师和学生) 我已经将firstName和lastName字段添加到springsecurityplugin生成的用户类中,因为所有用户都应该有名字和姓氏。我为“讲师”和“学生”创建了“用户”子类,以表示我的两种类型的用户。讲师和学生都是Grails域类 我正在Bootstrap.groovy中创建测试用户。我可以毫无问题地创建一个新的“用户”对象 当我尝试创建新的“Student”或“讲师”对象时,当通过构造函数设置时,firstName和lastName字段为空

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

我已经将firstName和lastName字段添加到springsecurityplugin生成的用户类中,因为所有用户都应该有名字和姓氏。我为“讲师”和“学生”创建了“用户”子类,以表示我的两种类型的用户。讲师和学生都是Grails域类

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

当我尝试创建新的“Student”或“讲师”对象时,当通过构造函数设置时,firstName和lastName字段为空

Spring安全插件用户类:

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}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
printLn "Last name is ${myUser.lastName}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
myUser.lastName = "Woot"
printLn "Last name is ${myUser.lastName}"
按预期将姓氏为琼斯的
打印到控制台

如果我尝试对“Student”子类Bootstrap.groovy执行相同的操作:

def myUser = new User(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones')
printLn "Last name is ${myUser.lastName}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
printLn "Last name is ${myUser.lastName}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
myUser.lastName = "Woot"
printLn "Last name is ${myUser.lastName}"
姓氏为null
打印到控制台,这不是我所期望的

我用普通的域类(不是用户类)尝试了同样的方法,我没有问题。我觉得在Spring安全初始化中,User类发生了一些特殊的事情,它阻止了子类设置超级属性,但是我找不到任何关于它的文档

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

def myUser = new User(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones')
printLn "Last name is ${myUser.lastName}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
printLn "Last name is ${myUser.lastName}"
def myUser = new Student(username: 'fred', password: '1234', firstName: 'Fred', lastName: 'Jones', grade: 'Junior')
myUser.lastName = "Woot"
printLn "Last name is ${myUser.lastName}"
按预期在控制台中打印
姓氏为Woot


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

您可以拥有一个用户对象,并为学生和讲师创建不同的角色。另一个选项是创建Student/讲师类,但不是让它们扩展User,而是让它们包含一个User