почему Grails сохраняет мой объект в базу данных после возвращения - PullRequest
0 голосов
/ 02 февраля 2019

Я использую версию Grails 2.4.5.Я проверяю состояние при сохранении.Если мое условие соответствует, я пытаюсь вернуться с сообщением вместо сохранения.Но он показывает мне сообщение, которое я хочу, но в то же время сохраняет свойства объекта в базе данных.Может ли кто-нибудь помочь мне в этом, пожалуйста?Вот мой код ниже:

@Transactional
def save(AccountHead accountHeadInstance) {
    if (!request.method.equals('POST')) {
        redirect(action: 'index')
        return
    }
    LinkedHashMap result = new LinkedHashMap()
    String outPut

    if (accountHeadInstance.id) {
        if (accountHeadInstance.id == accountHeadInstance.subParentId) {
            result.put(CommonUtils.IS_ERROR, Boolean.TRUE)
            result.put(CommonUtils.MESSAGE, "Sorry, Same account can not be parent of it's  own")
            outPut = result as JSON
            render outPut
            return
            // here should it return, is shows the message ok but saving the object. if I print something after this block it does not execute
        }
    }

    if (accountHeadInstance.hasErrors()) {
        def errorList = accountHeadInstance?.errors?.allErrors?.collect{messageSource.getMessage(it,null)}
        result.put(CommonUtils.IS_ERROR, Boolean.TRUE)
        result.put(CommonUtils.MESSAGE, errorList?.join('\n'))
        outPut = result as JSON
        render outPut
        return
    }

    accountHeadInstance.hasChild = params.position == CommonUtils.POSITION_FIRST
    accountHeadInstance.save flush:true
    result.put(CommonUtils.MESSAGE, "Account head saved successfully.")
    outPut = result as JSON
    render outPut
    return
}

1 Ответ

0 голосов
/ 02 февраля 2019

Хорошо, вы используете @Transactional, поэтому любые изменения в доменном объекте будут устанавливать этот объект как грязный, и когда транзакция будет завершена, они будут сохранены неявно.Чтобы предотвратить это, вы можете использовать accountHeadInstance.discard ().

Однако я вынужден сказать вам, что ваш код как несколько анти-паттернов Grails.

Любая бизнес-логика, особенно та, которая использует @Transactional, должна быть перенесена в службы, а не в контроллеры.Контроллеры должны просто использоваться для привязки входящих параметров, маршрутизации к сервисам и получения результатов.

Хотя вы можете использовать домены в качестве параметров привязки объекта команды, это, как правило, не очень хорошая идея, с точки зрения безопасности.

При желании вы можете делать такие "Groovy" вещи, как это:

LinkedHashMap result = [:]
result[CommonUtils.IS_ERROR] = Boolean.TRUE)
render result as JSON
...