2014-10-15 20 views
5

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ąć.

wersja

Grails 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.

+0

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) –

+0

@Andrew dzięki za sugestię, ale to nie miało żadnego efektu. – kaskelotti

+0

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/' –

Odpowiedz

6

Upewnij się, że skanowanie komponentów zostało skonfigurowane w twoim słoiku. Zapoznaj się z sekcją zatytułowaną "Używanie Spring Namespaces" tutaj http://grails.org/doc/latest/guide/spring.html#theBeanBuilderDSLExplained. Możesz także użyć zasobów.xml i dodaj skanowanie komponentu do tego pliku, jeśli nie możesz zmodyfikować swojego słoika.

Alternatywnie, można również podłączyć się fasolę, jeden po drugim, choć jest to uciążliwe i nużące:

beans = { 
    myComponent(com.my.MyComponent){ 
    someOtherService = ref('someOtherService') //if there are other beans to wire by name 
    propertyOne = "x" 
    propertyTwo = 2 
    } 
} 
+0

Dziękujemy za pomysł użycia debuggera. Zobaczę, czy uda mi się znaleźć odpowiednie narzędzia. – kaskelotti

+0

Skorzystaj z bezpłatnej wersji próbnej IntelliJ IDEA ultimate, która jest dobra przez 30 dni. Wsparcie dla Great Grails. Alternatywnie STS jest całkiem przyzwoity i bezpłatny. – th3morg