2014-10-15 3 views
5

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를 사용하지 않게하는 빈을 가져옵니다.

그러나 적어도 부분적으로는이 문제가 해결됩니다. 나는 여전히 스프링 어노테이션을 사용할 수있는 솔루션에 관심이있다.

+0

정말 어떤 대답을 할 Grails는이 지역의 주변에 충분한 파고하지 않았습니다. 그러나, grails.spring.bean.packages = [ "com.sample.app ..."]'를'Config.groovy' ('myComponent '이 정의되거나 부모 패키지 인 경우, Grails는 서브 패키지를 스캔 할 것입니다.) –

+0

@Andrew는 제안에 감사하지만 그 효과가 없습니다. – kaskelotti

+0

흠, 나쁜 리드를 유감스럽게 생각합니다. 가능하다면 (번들 된 항아리에 대해 언급 한대로 긴 샷이다.) Spring XML을'grails-app/conf/spring /'아래의 resources.xml 파일로 옮겨 볼 수도있다. –

답변

6

병에 부품 검사가 설정되어 있는지 확인해야합니다. "스프링 네임 스페이스 사용하기"섹션의 체크 아웃은 http://grails.org/doc/latest/guide/spring.html#theBeanBuilderDSLExplained입니다. 리소스를 사용할 수도 있습니다.xml을 추가하고 항아리를 수정할 수없는 경우 구성 요소 검색을 해당 파일에 추가하십시오. 이 복잡하고 지루하지만

양자 택일로, 당신은 또한 콩 하나 하나를 연결할 수 있습니다 :

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

디버거를 사용해 주셔서 감사합니다. 내가 이것에 대한 적절한 도구를 찾을 수 있는지 보겠습니다. – kaskelotti

+0

IntelliJ IDEA 궁극의 무료 평가판을 30 일 동안 사용해보십시오. Great Grails를 지원합니다. 아니면 STS 꽤 괜찮은 무료입니다. – th3morg