Подтвердить что ты не робот

Внедрение конфигурации приложения Grails в эксплуатацию

Я создаю службу grails, которая будет взаимодействовать с сторонним REST API через библиотеку Java. Библиотека Java требует учетных данных для REST API с помощью URL-адреса, имени пользователя и пароля.

Я хотел бы сохранить эти учетные данные в 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):

  • Вставить grailsApplication.config.apiCredentials в службу в контроллере при создании службы?

  • Предоставить какую-либо форму конструктора в службе, которая позволяет передавать учетные данные службе в момент создания экземпляра?

Наличие учетных данных, введенных в службу, является идеальным. Как это можно сделать?

4b9b3361

Ответ 1

Объект 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();
    }
}

Ответ 2

Даже если grailsApplication можно вводить в сервисы, я думаю, что службам не нужно иметь дело с конфигурацией, потому что сложнее протестировать и нарушить принцип единой ответственности. Spring, с другой стороны, может работать с конфигурацией и конкретизацией более надежным способом. В своих документах у Grails выделенный раздел.

Чтобы ваш пример работал с помощью Spring, вы должны зарегистрировать свою службу как bean в resources.groovy

// Resources.groovy
import com.example.ExampleApiClient

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

Затем вы сможете ввести зависимость в свою службу

class ExampleService {
    def exampleApiClient

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

Кроме того, в вашем файле Config.groovy вы можете переопределить любое свойство bean, используя синтаксис соглашения Grails по конфигурации: beans.<beanName>.<property>:

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

Оба Config.groovy и resources.groovy поддерживают различную конфигурацию среды.

Ответ 3

В контекстах, где вы не можете вводить grailsApplication bean (сервис не является одним из тех, который описан Джоном Крамом), например, вспомогательный класс, расположенный в src/groovy, вы можете получить к нему доступ, используя Держатели класс:

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