2011-02-11 6 views
32

Java 라이브러리를 통해 제 3 자 REST API와 상호 작용할 grails 서비스를 만들고 있습니다. Java 라이브러리는 url, username 및 password를 사용하여 REST API에 대한 신임장을 필요로합니다.Grails 애플리케이션 구성을 서비스에 삽입하십시오.

이러한 자격 증명을 configuration/Config.groovy에 저장하고 서비스에 사용할 수 있도록하고 자격 증명을 요구하기 전에 서비스에서 사용할 수 있도록하십시오.

grailsApplication.config가 컨트롤러에게 제공하고 있음을 알 그 관련 설정 값들은 서비스에 제공 될 수있는 서비스 방법을 통해, 이와 같은 :

package example 

class ExampleController { 

    def exampleService 

    def index = { } 

    def process = { 
     exampleService.setCredentials(grailsApplication.config.apiCredentials) 
     exampleService.relevantMethod() 
    } 
} 


package example 

import com.example.ExampleApiClient; 

class ExampleService { 

    def credentials 

    def setCredentials(credentials) { 
     this.credentials = credentials 
    } 

    def relevantMethod() { 

     def client = new ExampleApiClient(
      credentials.baseUrl, 
      credentials.username, 
      credentials.password 
     ) 

     return client.action(); 
    } 
} 

이 접근 방식은 setCredentials() 컨트롤러 호출에 따라 약간의 결함이 있다고 생각합니다. 서비스에 자동으로 자격 증명을 사용하게하면 더욱 강력 해집니다.

이 두 가지 옵션 중 하나는 (내가 Grails는 충분히 현재 익숙하지 않은) 실행 가능 :

  1. 는 컨트롤러에서 서비스에 주입한다 grailsApplication.config.apiCredentials이 서비스는

    을 만들 때?

  2. 자격 증명을 인스턴스화 할 때 서비스에 전달할 수 있도록 서비스에 컨스트럭터를 제공하십시오.

자격 증명을 서비스에 삽입하는 것이 이상적입니다. 어떻게이 일을 할 수 있겠습니까?

+1

전체 GrailsApplication 객체 대신 실제 설정 속성을 삽입하는 방법이 있다면 여전히 유용 할 것입니다. –

답변

73

grailsApplication 객체는이를 수 있도록 서비스 내에서 볼 수 있습니다 :

당신의 GrailsApplication 빈을 주입 할 수없는 상황에 대한
package example 

import com.example.ExampleApiClient; 

class ExampleService { 

    def grailsApplication 

    def relevantMethod() { 

     def client = new ExampleApiClient(
      grailsApplication.config.apiCredentials.baseUrl 
      grailsApplication.config.apiCredentials.username, 
      grailsApplication.config.apiCredentials.password 
     ) 

     return client.action(); 
    } 
} 
+10

메소드 내에서 grailsApplication.config. [...]를 사용해야 함을 발견했습니다. 그렇지 않으면 메소드 밖에서 설정 파일에서 데이터를 가져 와서 빼내면 널 포인터가 표시됩니다. – arcdegree

+0

고마워요. 귀하의 의견은 저에게 많은 좌절감을 안겨주었습니다. – aa8y

3

(존 크램에 의해 설명 된대로 서비스가 그 중 하나가 아닌), 예를 들면, SRC에/그루비에 위치한 헬퍼 클래스, 당신은 홀더에게 클래스를 사용하여 액세스 할 수 있습니다

def MyController { 
    def myAction() { 
     render grailsApplication == grails.util.Holders.grailsApplication 
    } 
} 
10

에도 grailsApplication 불구하고이 서비스에 주입 될 수있다, 나는 서비스 수오 생각 Single Responsibility principle을 테스트하고 깨기가 더 어렵 기 때문에 구성을 다루지 않아도됩니다. 상대방의 Spring은보다 강력한 방법으로 구성 및 인스턴스화를 처리 할 수 ​​있습니다. Grails의 문서에는 a dedicated section이 있습니다.

그런 다음 당신은 당신의 서비스 또한

class ExampleService { 
    def exampleApiClient 

    def relevantMethod(){ 
     exampleApiClient.action() 
    } 
} 

에 의존성을 주입 할 수있을 것입니다 당신은 resources.groovy

// Resources.groovy 
import com.example.ExampleApiClient 

beans { 
    // Defines your bean, with constructor params 
    exampleApiClient ExampleApiClient, 'baseUrl', 'username', 'password' 
} 

에서 빈으로 서비스를 등록해야합니다, 스프링을 사용하여 예를 작동하게하려면 , Config.groovy 파일에서 Grails 규칙을 통한 설정 구문을 사용하여 모든 빈 속성을 오버라이드 할 수 있습니다 : beans.<beanName>.<property> :

// Config.groovy 
... 
beans.exampleApiClient.baseUrl = 'http://example.org' 

Config.groovyresources.groovy은 서로 다른 환경 구성을 지원합니다.

관련 문제