【发布时间】:2016-12-01 14:31:26
【问题描述】:
当一个新对象被添加到具有 hasMany 关系的域时,我想做一些工作。
例如,对于Person hasMany Hobby,在拦截器中为addToHobby() 和removeFromHobby() 做一些工作,如下所示:
class Person {
String name
boolean likesFishing
static hasMany = [hobby: Hobby]
addToHobby(Hobby h) {
super.addToHobby(h) //*throws missingMethod exception
if (h.name="Fishing") {this.likesFishing=true;}
}
removeFromHobby(Hobby h) {
super removeFromHobby(h)
if (h.name="Fishing") {this.likesFishing=false;}
}
}
由于某种原因引发了一个错误,我猜这与 Gorm 正在完成的一些魔术工作有关,而当方法被覆盖时没有完成。无论如何围绕这个?我可以将这种东西放在 beforeUpdate 或类似的东西中,但这更通用,并且会捕获每个更新,而不仅仅是从列表中添加或删除。
请注意,抛出的错误不是7年前关于该主题的帖子中提到的空指针异常(显然是由于无法启动Set引起的),而是InvocationTargetException阻止了超级方法被调用。
No signature of method: testapp.Person.addToHobby() is applicable for argument types: (testapp.Hobby) values: [testapp.Hobby : (unsaved)]
Possible solutions: addToHobby(testapp.Hobby), addToHobby(java.lang.Object), getHobby(). Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:210)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
【问题讨论】:
-
不这么认为。该问题没有调用 addTo 方法的超类。
-
没错,因为你不能。很高兴你得到了答案。
-
我的意思是问题不一样,因此它不是骗子。接受的答案描述了实现相同目标的方法。
-
我建议您不要更改域 addTo,而是将此代码放在您调用的服务中。
标签: grails grails-domain-class