Mam specjalnie spreparowane sprężyny, które są pakowane w słoik, który jest następnie ustawiany jako zależność od mojej aplikacji Grails. Załadować app-kontekst fasoli z oświadczeniem importBeans w resoueces.groovy jakAutomatyczne wypowiadanie komponentu sprężyny w Grails
beans = {
importBeans('classpath:app-context-my-component.xml')
}
app-context-my-component.xml
ma kilka definicji fasoli i następujące wiersze
<context:annotation-config />
<context:property-placeholder location="classpath:my-component.properties" />
Komponent Staram się używać z Grails jest opatrzony komentarzem pod numerem @Component("myComponent")
.
Grails ładuje kontekst aplikacji zewnętrznej. Wiem o tym, ponieważ po raz pierwszy nie miałem pliku .properties w ścieżce klas i nie mamy mechanizmu zastępczego dla brakującej właściwości w moich deklaracjach @Value.
W regulatorze Grails składnik stosuje się jako
class MyController {
def myComponent
def someaction() {
myComponent.doSomething()
}
}
W rezultacie NullPointerException tj autowiring składnika nie działa po wszystkich. Próbowałem użyć @Autowired w kontrolerze, ale to dało tak dziwne problemy, że myślałem, że to nie może być droga, którą chcę wziąć.
wersjaGrails w użyciu jest 2.3.6 Komponent Wiosna jest również skonfigurowany do korzystania Wiosna wersję 3.2.7 w celu uniknięcia niezgodności.
UPDATE
Teraz znowu czas w moich rękach tego problemu, skonfigurować rejestrowanie Wiosna aby zorientować się, co znajduje się happenig. Cóż, jest mnóstwo dzienniku, że ładowanie kontekst Wiosna produkuje, ale oto co udało mi się grep z całej partii
INFO xml.XmlBeanDefinitionReader Loading XML bean definitions from class path resource [app-context-my-component.xml]
INFO support.PropertySourcesPlaceholderConfigurer Loading properties file from class path resource [my-component.properties]
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public myapp.external.MyComponent myapp.MyService.getMyComponentClient()
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public myapp.external.MyComponent myapp.MyService.getMyComponentClient()
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public myapp.external.MyComponent myapp.MyService.getMyComponentClient()
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public void myapp.MyService.setMyComponentClient(myapp.external.MyComponent)
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public void myapp.MyService.setMyComponentClient(myapp.external.MyComponent)
DEBUG framework.CglibAopProxy Unable to apply any optimisations to advised method: public void myapp.MyService.setMyComponentClient(myapp.external.MyComponent)
I zmienił nazw dziennika, ale myapp.external nazw odnosi się do słoika zewnętrznego pakiet i myapp namespace odnosi się do przestrzeni nazw aplikacji Grails. Zmieniłem sposób użycia, aby komponent zewnętrzny był używany z poziomu Usługi zamiast bezpośrednio z Kontrolera, ale szczegóły nie zmieniły się w działaniu.
Z mojego rozumienia, ładowanie kontekstu wiosennego poszło dobrze.
UPDATE 2
podstawie @ th3morg „s odpowiedź mam pomysł, aby spróbować tylko config oparty na XML, pomijając wszystkie @Component i takie adnotacje z fasoli. I zadziałało! Teraz Grails udaje się zaimportować fasolę i nie powoduje już użycia NPE.
Chociaż to rozwiązuje mój problem, przynajmniej częściowo. Nadal interesuje mnie rozwiązanie, w którym można stosować adnotacje wiosenne.
naprawdę nie wykopane na tyle w tej dziedzinie Grails, aby dać pewną odpowiedź. Ale spróbuj powiedzieć Grails, który pakiet (y) skanować dla fasoli, dodając 'grails.spring.bean.packages = [" com.sample.app ... "]' na 'Config.groovy' (pakiet, w którym' myComponent 'jest zdefiniowany lub pakiet nadrzędny, Grails skanuje podpakiety) –
@Andrew dzięki za sugestię, ale to nie miało żadnego efektu. – kaskelotti
Hmm, przepraszam za zły trop. Jeśli to możliwe (i jest to długa perspektywa, biorąc pod uwagę to, co wspomniano o słoiku z pakietem ...), możesz także spróbować przenieść swój Spring XML do pliku o nazwie 'resources.xml' w folderze' grails-app/conf/spring/' –