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?
Które @Mixin? 'groovy.lang.Mixin' lub' grails.util.Mixin'? Spróbuj użyć drugiej, jeśli jest to groovy mixin. – dmahapatro
Próbowałem obu. Ani jeden, ani drugi nie działał. – aiolos
@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