Grails 覆盖 domain.addTo

标签 grails grails-domain-class

当一个新对象被添加到具有 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 阻止了 super 方法被调用。
    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)

最佳答案

域方法通过元编程或类似技术注入(inject)到您的类中,因此不存在 super.addTo*() 之类的东西。 .

最简单的方法是使用 interceptors正如您所提到的,或者您可以添加自己的元方法来覆盖 GORM 的默认 addTo的。

例如:

class BootStrap {

  def init = { servletContext ->
    def oldAddToHobby = Person.metaClass.getMetaMethod 'addToHobby'

    Person.metaClass.addToHobby{ Hobby h ->
      oldAddToHobby.invoke delegate, h
      println 'blah 2' 
    }        
  }

  def destroy = {}
}

关于Grails 覆盖 domain.addTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913227/

相关文章:

grails - Grails sitemesh是否有不支持带有开放HTML正文标签的语句的解决方法?

mysql - 与数据库交互时是否需要 Grails 域类?

grails - 在grails中保存域对象

grails - Grails脚本中的HttpBuilder

grails - 使用XmlSlurper/GPathResult进行重大更改Grails 2.2.0-> Grails 2.3.5并选择具有未知 namespace 的attirbutes

data-binding - 如何在一个表单中混合多个域对象?

unit-testing - 如何将 springSecurityService 注入(inject) Grails 域类以在 Grails 2.4.2 中进行 Controller 单元测试

grails - 获取字段的值

spring - 服务未注入(inject) Grails 域类、Grails 2.0.0 和 2.0.3

grails - Grails-withTransaction block 中的异常不起作用