jar 파일에 번들로 제공되는 맞춤형 Spring을 가지고 Grails 애플리케이션에 대한 종속성으로 설정됩니다. 내가Grails에서 맞춤형 Spring 구성 요소를 Autowiring
beans = {
importBeans('classpath:app-context-my-component.xml')
}
app-context-my-component.xml
처럼 resoueces.groovy에 importBeans 문 빈을위한 응용 프로그램 컨텍스트를로드 약간의 빈 정의와 다음 줄
<context:annotation-config />
<context:property-placeholder location="classpath:my-component.properties" />
내가 함께 사용할 노력하고있어 구성 요소가 Grails는 @Component("myComponent")
으로 주석 처리됩니다.
Grails가 외부 응용 프로그램 컨텍스트를로드 중입니다. 처음에는 classpath에 .properties 파일이 없기 때문에 @Value 선언에서 누락 된 속성에 대한 폴백 메커니즘이 없기 때문에 알 수 있습니다. Grails의 컨트롤러
, 상기 구성 요소는 결과가 모두 후에 작동하지 않은 성분의 NullPointerException이 즉에서 autowiring이다class MyController {
def myComponent
def someaction() {
myComponent.doSomething()
}
}
로서 사용된다. 나는 컨트롤러에서 @Autowired를 사용하려고 시도했지만, 그것이 내가 택한 길일 수는 없다고 생각한 이상한 문제를 일으켰다. 사용
Grails의 버전은 2.3.6 인 봄의 구성 요소는 비 호환성을 방지하기 위해 봄 버전 3.2.7을 사용하도록 설정되어 있습니다.
UPDATE는
이제이 문제에 대한 내 손에 다시 시간, 나는 happenig 무엇을 파악하기 위해 봄 로깅을 설정합니다. 음, Spring 컨텍스트 로딩 여기에서 생산하지만 로그가 많이 나는 로그의 네임 스페이스를 변경
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)
전체 많이에서 grep을 관리 기능,하지만 myapp.external 네임 스페이스는 외부 항아리를 말한다 패키지 및 myapp 네임 스페이스는 Grails 응용 프로그램 네임 스페이스를 참조합니다. 사용법을 변경하여 외부 구성 요소가 Controller에서 직접 사용되는 대신 서비스에서 사용되지만 세부 사항은 동작에 변화가 없었습니다.
제 생각에 봄 컨텍스트 로딩은 잘 진행되었습니다.
업데이트 2 나는 모든 @Component와 빈에서 같은 주석을 건너 뛰는 만 XML 기반의 설정과 시도 할 생각이있어 @ th3morg의 답변에 따라
. 그리고 효과가있었습니다! 이제 Grails는 더 이상 NPE를 사용하지 않게하는 빈을 가져옵니다.
그러나 적어도 부분적으로는이 문제가 해결됩니다. 나는 여전히 스프링 어노테이션을 사용할 수있는 솔루션에 관심이있다.
정말 어떤 대답을 할 Grails는이 지역의 주변에 충분한 파고하지 않았습니다. 그러나, grails.spring.bean.packages = [ "com.sample.app ..."]'를'Config.groovy' ('myComponent '이 정의되거나 부모 패키지 인 경우, Grails는 서브 패키지를 스캔 할 것입니다.) –
@Andrew는 제안에 감사하지만 그 효과가 없습니다. – kaskelotti
흠, 나쁜 리드를 유감스럽게 생각합니다. 가능하다면 (번들 된 항아리에 대해 언급 한대로 긴 샷이다.) Spring XML을'grails-app/conf/spring /'아래의 resources.xml 파일로 옮겨 볼 수도있다. –