2014-09-22 2 views
1

필자는 이전에 Grails 서비스를 사용해 본 적이 없었지만 웹 검색 결과에 따라 도메인 객체에 주입 할 수 있습니다. 나는 다음과 같은 도메인 클래스가 있다면 나는 Book 객체가 def book = new Book(), book.bookService 설정해야 사용하여 인스턴스화 할 때,,Grails 도메인 객체에 서비스와 유사한 컴포넌트를 삽입하려면 어떻게해야합니까?

class Book { 

    BookService bookService 

} 

을 (BookService 어딘가에 정의되어 있다고 가정)?

외부 서비스 (또는 서비스와 유사한 구성 요소)를 주입하려면 어떻게해야합니까? 예를 들어, 사용 가능한 ISBN API 클라이언트가 있다면 grails에 같은 방식으로 삽입 할 수 있습니까? 예를 들어 클라이언트가 IsbnApi이라면 다른 서비스처럼 자동으로 주입 할 수 있습니까? 아래의 코드가 작동합니까? 이 질문에 대한 이전 응답에 따라

class Book { 

    @Transient 
    @Autowire 
    IsbnApi isbnApi 

} 

, 난 이미 도메인 클래스 이런 식으로 정의했습니다 : 이제

class Book { 

    static transients = ['isbnApi'] 

    IsbnApi isbnApi 

} 

, 이것은 내가 원하는 모든 것을 할 수있다, 그러나 나는 또한 테스트 할 자동 주입은 심지어 을 응용 프로그램을 실행하지 않고도 작동 할 것이라고. 유닛 테스트에서 모의 ​​"서비스"를 수동으로 설정해야합니다.

IsbnApi isbnApi = Mock() 
Book book = new Book() 
book.isbnApi = mockIsbnApi 

test/integration에 테스트를 이동하여 자동 주입을 확인하려하고 doWithSpring을 사용하여 콩 세트.

def doWithSpring() { 
    isbnApi = (InstanceFactoryBean, mockIsbnApi, isbnApi) 
} 

void "test automatic injection"() { 
    given: 
    IsbnApi isbnApi = Mock() 
    Book book = new Book() 
    //removed: book.isbnApi = mockIsbnApi 

    expect: 
    book.isbnApi //this fails 
} 

나는 또한 this answer to a similar question에서 추가 정보를 발견했다. 특히, 당신이 '데프'를 사용하고 있기 때문에 당신이 과도에 추가 할 필요가 없습니다

참고을 나열합니다. 정적 메서드에서 액세스하려고합니까? 인스턴스 필드이므로 인스턴스에서만 액세스 할 수 있습니다.

+0

을 참조하십시오 어디 IsbnApi 저장됩니까? 그루비/src? –

+0

그것은 어디에서든지 : src/groovy' 또는 다른 jar 등등 일 수 있습니다. –

답변

2

규칙에 따라 Grails 서비스는 자동으로 종속성 삽입 후보 (= 다른 클래스에 삽입 될 수 있음)입니다. 다른 수업을 원하면 conf/spring/resources.groovy에 추가해야합니다.

예컨대 :

import foo.bar.IsbnApi 

beans = { 
    isbnApi(IsbnApi) 
} 

Bean Builder 문서 섹션에서보세요.

필드가 영구 속성으로 처리되지 않도록하려면 고정 transients 필드를 사용할 수 있습니다. 예를 들어

:

class User { 
    def grailsApplication 
    static transients = ['grailsApplication'] 
} 

transients documentation

+0

Grails가'def isbnApi'를 영속 속성으로 오인하지 않도록 충분합니까? Grails가'자원에서 찾으면.그루비 (groovy)는 영구적 인 것이 아니라 주입 된 속성으로 자동적으로 처리합니까? 단위 테스트를 통해이를 어떻게 확인할 수 있습니까? –

+0

'transients' 필드를 사용할 수 있습니다 (답변 업데이트) – micha

+0

테스트 방법이 있습니까? 'doWithSpring'은 'Book book = new Book()'과 같이 부르면 작동하지 않는 것 같습니다. –

관련 문제