Grails Сохранить / обновить встроенные объекты. Обновление также обновляет пароль. Grails Spring Security
Я пытаюсь сохранить объект сборов в коллекции, коллекция является встроенным объектом. Функциональность обновления работает, как и ожидалось. Проблема в том, когда я обновляю пароль тоже.
Я использую плагин Grails Spring. у него есть класс для кодирования пароля. UserPasswordEncoderListener
Использование Grails 3.3.8, Gorm 6.1.10.RELEASE и mongodb.
Это способ, которым я пытаюсь обновить коллекцию:
def user = User.findByUsername("username")
def charge = new Charge(
amount: "100",
description: "some description",
user: user
)
def customer = new Customer(
charges: [charge]
)
user.customer = customer
user.save flush: true, failOnError:true
Любая идея? или каков наилучший вариант для сохранения / обновления встроенных объектов.? В документации говорится о некоторых методах https://docs.grails.org/latest/ref/Domain%20Classes/addTo.html
Я пытался без успеха.
Класс пользователя
@GrailsCompileStatic
@EqualsAndHashCode(includes='username')
@ToString(includes='username', includeNames=true, includePackage=false)
class User implements Serializable {
/* MongoDB */
ObjectId id
...
String username
String password
/* Role Users */
Set<Role> authorities
Customer customer
static embedded = ['authorities', 'customer']
static mapping = {
collection "users"
password column: '`password`'
}
...
}
Класс клиента
@GrailsCompileStatic
class Customer implements Serializable {
...
static hasMany = [
charges: Charge
]
...
}
Класс зарядки
@GrailsCompileStatic
class Charge implements Serializable {
ObjectId id
String amount
static belongsTo = [ user: User ]
static mapping = {
collection "charges"
}
...
}
Класс UserPasswordEncoderListener
@Override
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
if (event.entityObject instanceof User) {
User u = (event.entityObject as User)
if (u.password && (event.eventType == EventType.PreInsert || (event.eventType == EventType.PreUpdate && u.isDirty('password')))) {
event.getEntityAccess().setProperty("password", encodePassword(u.password))
}
}
}