2013-09-24 17 views
6

W ramach mojego ostatniego projektu grails 2.3.0 używam adnotacji @Mixin, aby wymieszać klasę pomocnika, aby zachować więcej SUCHEGO controller.Sterownik @Mixin działa po ponownym skompilowaniu działającej aplikacji

Mixin działa, jeśli wprowadzono pewne zmiany w kontrolerze, aby wymusić ponowną kompilację kontrolera. Po początkowej kompilacji (grails run-app) pomocnika nie miesza się - otrzymuję próbę uzyskania dostępu do metody z klasy pomocniczej przez MissingMethodException.

Oto mój pomocnik witin src/groovy:

class ProjectHelper { 
    def withProject(id, Closure c) { 
     def project = Project.get(id) 
     if (project) { 
      c.call project 
     } else { 
      flash.message = 'Project not found!' 
      render view: 'myView' 
      return 
     } 
    } 
} 

I (jeden) do controller który wykorzystuje ProjectHelper:

@Mixin(ProjectHelper) 
class ProjectController { 
    def index() { 
     withProject params.projectId, {project -> 
      // do something with the project 
     } 
    } 
} 

Kiedy cleane projektu przy użyciu grails clean i uruchomieniu aplikacji, I uzyskać następujący błąd po uzyskaniu dostępu do project/index:

MissingMethodException occurred when processing request: 
    [GET] /<myApp>/project/ 
    No signature of method: <myPackage>.withProject() is applicable for argument types: 
    (java.lang.String, <myPackage>.ProjectController$_index_closure1_closure10) values: 
    [1, <myPackage>[email protected]] 

Po pewnych zmianach w ReportController (np. dodając pojedynczą spację) grails kompiluje 2 pliki źródłowe i można użyć metody withProject. Uzyskiwanie dostępu do project/index działa zgodnie z oczekiwaniami.

Co tu jest nie tak? Czy to błąd, czy też coś mi brakuje?

Aktualizacja

Okazuje się, że zupełnie brakowało, że używając grails.util.Mixin daje mi inny wyjątek (MissingPropertyException) z powodu braku dostępu do mieszanych właściwości klasy (w moim przypadku: flash) (patrz JIRA this issue), który działa z groovy.lang.Mixin (po rekompilacji).

Czy istnieje sposób ręcznego przekompilowania/wstrzyknięcia/wymieszania z groovy.lang.Mixin w czasie wykonywania lub czy muszę znaleźć inną obsługę błędów dla części else, dopóki problem nie zostanie rozwiązany?

Wszelkie sugestie?

+0

Które @Mixin? 'groovy.lang.Mixin' lub' grails.util.Mixin'? Spróbuj użyć drugiej, jeśli jest to groovy mixin. – dmahapatro

+0

Próbowałem obu. Ani jeden, ani drugi nie działał. – aiolos

+0

@dmahapatro Sprawdziłem to jeszcze raz! Było wczoraj trochę za późno - tęskniłem za tym grails.util.Mixin daje kolejny wyjątek. Zaktualizuję moje pytanie ... – aiolos

Odpowiedz

2

Byłem regularnie uruchomiony w tym samym MissingMethodException, gdy po podobny wzór ponownego użycia kodu za pomocą mixins.

W moim przypadku zmiana groovy.lang.Mixin na grails.util.Mixin (a dokładniej, dodanie do mojego kontrolera importu dla grails.util.Mixin) całkowicie rozwiązała problem.

Jeśli nie masz dostępu do zmiennych kontrolera, możesz utknąć, czekając na rozwiązanie GRAILS-9905. Powinienem jednak zauważyć, że istnieją pewne sugestie dotyczące pracy wymienionej w dyskusji o defektach.

+1

Nie mam pojęcia dlaczego, ale to nie działa. Próbowałem obu adnotacji '@ Mixin' z importowaniem i bez:/ – Opal

1

Rozwiązaniem, które ostatecznie pracował dla mnie było ręcznie wstrzykiwanie Mixin w konstruktorze kontrolera:

import com.example.MyMixin 

class SomethingController { 
    def SomethingController() { 
    SomethingController.metaClass.mixin(MyMixin) 
    } 
} 
+0

Niestety to również nie działa z grails v. 2.3.7 lub może czegoś brakuje. Naprawdę denerwujące. – Opal

+0

@Opal Utknąłem przy użyciu 2.2.4. Nie jestem pewien, ale możliwe, że możesz zrobić 'SomethingController.mixin MyMixin' bezpośrednio (bez" metaClass "). Zasadniczo potrzebujesz [runtime mixin] (http://groovy.codehaus.org/Runtime+mixins). – grammar31

+0

@ gramatyka31 Pracowałem dla mnie, używam Grails 2.3.11. Dziękuję za tę odpowiedź. –