Grails DB 保存时出错(不是域或没有标识符。)
Grails DB Error at save ( not a domain or has no identifier.)
我正在开发一个需要读取遗留数据库中现有数据库表的新应用程序。为此,我还必须让它在开发环境中工作。但是当我尝试创建新记录时失败并显示以下消息:
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'
}
}
我不知道它们是什么意思:"is not a domain or has no identifier" 以及显式重定向是什么意思,我应该重定向到什么?这是唯一的解决方案吗 - 我不敢相信。
控制者:
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()
好吧,我不确定,但似乎 roleType 有错误,但是 roleType.hasErrors() 在 validate() 之前被调用 或 保存().
我想如果你在顶部添加一些行:
def save(RoleType roleType) {
roleType.validate()
throw new RuntimeException("${roleType.errors}")
if (roleType == null) {
...
}
}
您将看到字段和失败的约束。
已更新
看起来很奇怪。我建议按照建议尝试显式重定向或简化您域中与 id 相关的映射。
问题是您的控制器正在使用 id
,您将其替换为 roleType
。
我正在开发一个需要读取遗留数据库中现有数据库表的新应用程序。为此,我还必须让它在开发环境中工作。但是当我尝试创建新记录时失败并显示以下消息:
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'
}
}
我不知道它们是什么意思:"is not a domain or has no identifier" 以及显式重定向是什么意思,我应该重定向到什么?这是唯一的解决方案吗 - 我不敢相信。
控制者:
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()
好吧,我不确定,但似乎 roleType 有错误,但是 roleType.hasErrors() 在 validate() 之前被调用 或 保存().
我想如果你在顶部添加一些行:
def save(RoleType roleType) {
roleType.validate()
throw new RuntimeException("${roleType.errors}")
if (roleType == null) {
...
}
}
您将看到字段和失败的约束。
已更新
看起来很奇怪。我建议按照建议尝试显式重定向或简化您域中与 id 相关的映射。
问题是您的控制器正在使用 id
,您将其替换为 roleType
。