保存时Grails DB错误(不是域或没有标识符。)

时间:2017-03-19 10:47:48

标签: grails gorm

我正在开发一个需要读取旧数据库中现有数据库表的新应用程序。要做到这一点,我也必须让它在开发环境中工作。但是当我尝试创建一个新记录时,它失败并显示以下消息:

URI
    /roleType/save
Class
    grails.web.mapping.mvc.exceptions.CannotRedirectException
Message
    null
Caused by
    Cannot redirect for object [com.mytrading.legacy.RoleType : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead

要获取我运行的控制器和视图" grails generate-all"。

为了清晰起见,删除了一些字段的域名如下所示:

class RoleType {
    int roleType

    static mapping = {
        table 'RoleType'
        version false
        id name: 'roleType', type:'int', generator:'assigned'
        roleType        column: 'RoleType'

    }
}

我不知道他们的意思:"不是域名或没有标识符"以及他们对显式重定向的含义,我应该重定向到什么?这是唯一的解决方案 - 我无法相信。

控制器:

import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional
import grails.plugin.springsecurity.annotation.Secured

@Secured(['ROLE_ADMIN','ROLE_SALES'])

@Transactional(readOnly = true)
class RoleTypeController {

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond RoleType.list(params), model:[roleTypeCount: RoleType.count()]
    }

    def show(RoleType roleType) {
        respond roleType
    }

    def create() {
        respond new RoleType(params)
    }

    @Transactional
    def save(RoleType roleType) {
        if (roleType == null) {
            transactionStatus.setRollbackOnly()
            notFound()
            return
        }

        if (roleType.hasErrors()) {
            transactionStatus.setRollbackOnly()
            respond roleType.errors, view:'create'
            return
        }

        roleType.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.created.message', args: [message(code: 'roleType.label', default: 'RoleType'), roleType.id])
                redirect roleType
            }
            '*' { respond roleType, [status: CREATED] }
        }
    }

    def edit(RoleType roleType) {
        respond roleType
    }

    @Transactional
    def update(RoleType roleType) {
        if (roleType == null) {
            transactionStatus.setRollbackOnly()
            notFound()
            return
        }

        if (roleType.hasErrors()) {
            transactionStatus.setRollbackOnly()
            respond roleType.errors, view:'edit'
            return
        }

        roleType.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.updated.message', args: [message(code: 'roleType.label', default: 'RoleType'), roleType.id])
                redirect roleType
            }
            '*'{ respond roleType, [status: OK] }
        }
    }

    @Transactional
    def delete(RoleType roleType) {

        if (roleType == null) {
            transactionStatus.setRollbackOnly()
            notFound()
            return
        }

        roleType.delete flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.deleted.message', args: [message(code: 'roleType.label', default: 'RoleType'), roleType.id])
                redirect action:"index", method:"GET"
            }
            '*'{ render status: NO_CONTENT }
        }
    }

    protected void notFound() {
        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.not.found.message', args: [message(code: 'roleType.label', default: 'RoleType'), params.id])
                redirect action: "index", method: "GET"
            }
            '*'{ render status: NOT_FOUND }
        }
    }
}

将代码添加到控制器后,我们得到:

URI
    /roleType/save
Class
    java.lang.RuntimeException
Message
    null
Caused by
    org.grails.datastore.mapping.validation.ValidationErrors: 0 errors

Around line 30 of grails-app\controllers\com\torntrading\legacy\RoleTypeController.groovy

27:    @Transactional
28:    def save(RoleType roleType) {
29:    roleType.validate()
30:    throw new RuntimeException("${roleType.errors}")
31:        if (roleType == null) {
32:            transactionStatus.setRollbackOnly()
33:            notFound()

2 个答案:

答案 0 :(得分:2)

问题是您的控制器正在使用您用id替换的roleType

答案 1 :(得分:1)

好的,我不确定,但似乎roleType有错误,但在 validate()之前调用 roleType.hasErrors() ()

我想如果你在顶部添加一些行:

def save(RoleType roleType) {
    roleType.validate()
    throw new RuntimeException("${roleType.errors}")

    if (roleType == null) {
        ...
    }
}

您将看到字段和失败的约束。

<强>已更新

看起来很奇怪。我建议按照建议尝试显式重定向,或者简化域中与id相关的映射。