Я пытаюсь сохранить объект сборов в коллекции, коллекция является встроенным объектом.Функциональность обновления работает, как и ожидалось.Проблема в том, что когда я обновляю пароль тоже.
Я использую плагин безопасности 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 class
@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))
}
}
}