由于内容管理总线,我准备了一些复杂的模型结构。
我的主要内容模型如下面的代码。
class CmsContent implements Comparable<CmsContent>, Taggable, Serializable {
Set<CmsContent> contents
static hasMany = [contents:CmsContent]
}
其他内容模型从上面扩展
class Menu extends CmsContent {
}
class Image extends CmsContent {
}
class Video extends CmsContent {
}
在控制器端,当将图像添加到菜单时,它完全正常工作
def addContent(){
Menu menuInstance = Menu.get(params.id)
if (menuInstance == null) {
notFound()
return
}
CmsContent content = CmsContent.get(params.contentId)
if (content == null) {
notFound()
return
}
menuInstance.addToContents(content)
menuInstance.save(flush: true)
request.withFormat {
'*'{
def result =[:] ;
result.status ='success';
render result as JSON
}
}
}
def removeContent(){
Menu menuInstance = Menu.get(params.id)
if (menuInstance == null) {
notFound()
return
}
long id = Long.valueOf(params.contentId)
CmsContent content = cmsContent.contents.find { it.id == id }
if (content == null) {
notFound()
return
}
menuInstance.removeFromContents(content)
menuInstance.save(flush: true)
request.withFormat {
'*'{
def result =[:] ;
result.status ='success';
render result as JSON
}
}
}
但是当我尝试删除面临的异常时。
Cannot get property 'name' on null object. Stacktrace follows:
Message: Cannot get property 'name' on null object
我在 DomainClassGrailsPlugin 中的grails代码中进行了跟踪。 我意识到addTo方法和第368行检查 prop.otherSide 属性
if (prop.bidirectional && prop.otherSide) {
}
遗憾的是removeTo方法没有检查 prop.otherSide 属性,因此名称字段抛出异常。
if (prop.bidirectional) {
if (prop.manyToMany) {
String name = prop.otherSide.name
arg[name]?.remove(delegate)
} else {
arg[prop.otherSide.name] = null
}
}
你怎么看?你同意我的意见吗?