Grails Сохранить / обновить встроенные объекты.Обновление также обновляет пароль.Grails Spring Security - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сохранить объект сборов в коллекции, коллекция является встроенным объектом.Функциональность обновления работает, как и ожидалось.Проблема в том, что когда я обновляю пароль тоже.

Я использую плагин безопасности 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))
            }
        }
    }
...