我正在开发一个需要读取旧数据库中现有数据库表的新应用程序。要做到这一点,我也必须让它在开发环境中工作。但是当我尝试创建一个新记录时,它失败并显示以下消息:
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()
答案 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相关的映射。