2016-08-26 2 views
3

Как использовать внешние конфигурации в приложении Spring?Как использовать свойства из файла конфигурации (свойства/yml) в приложении Spring Boot?

package hello.example2.Container 

import org.springframework.web.bind.annotation.PathVariable 
import org.springframework.web.bind.annotation.RequestMapping 
import org.springframework.web.bind.annotation.RestController 
import org.springframework.web.client.RestTemplate 

@RestController 
class ContainerController { 
    @RequestMapping("/container/{cid}") 
    public list(@PathVariable Integer cid) { 
     def template = new RestTemplate(); 
     def container = template.getForObject("http://localhost:5050/container/" + cid.toString(), Container); 
     return container; 
    } 
} 

Я хочу, чтобы заменить "http://localhost:5050" с опцией конфигурации (F.E. application.yml или application.properties).

Это мой файл приложения (Groovy):

package hello.example2 

import groovy.transform.CompileStatic 
import org.springframework.boot.SpringApplication 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration 
import org.springframework.boot.autoconfigure.SpringBootApplication 
import org.springframework.context.annotation.Configuration 

@SpringBootApplication 
@Configuration 
@EnableAutoConfiguration 
@CompileStatic 
class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

Я попытался установить «@Configuration» и «@EnableAutoConfiguration», но если честно, я не знаю, что они делают. Я новичок в Java/Groovy и Spring Framework (но не для программирования вообще).

Я прочитал эти страницы, но не полный пример только фрагменты:

[1] http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

[2] https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

+0

Хост будет установлен при развертывании. Вы можете установить имя и порт контекста в application.yml. Вам нужно учиться немного больше. Продолжайте читать документацию. – duffymo

+0

Да, мне нужно прочитать и узнать больше, но в какой-то момент вам нужно начинать попытки, и вот где я застрял :( – MonkeyMonkey

ответ

5

В файле конфигурации (application.yml или application.properties) добавить новую запись:

endpointUrl: http://localhost:5050 

Тогда впрыснуть это свойство в контроллере:

@RestController 
class ContainerController { 

    @Value("${endpointUrl}") 
    private String ednpointUrl; 

    @RequestMapping("/container/{cid}") 
    public list(@PathVariable Integer cid) { 
     def template = new RestTemplate(); 
     def container = template.getForObject(endpointUrl+"/container/" + cid.toString(), Container); 
     return container; 
    } 
} 
+0

И где я должен поместить свой application.yml? Я положил его в config/application.yml Когда я создаю проект с помощью gradle ('gradle bootRun'), я не могу скомпилировать из-за' [..]/hello/example3/container/ContainerController.groovy: 11: Ожидаемый '$ endpointUrl' быть встроенной константой type java.lang.String [..] ' – MonkeyMonkey

+0

Файл application.yml shoud находится под src/main/resources – codependent

+0

Или более тщательно, ваш файл application.yml или application.properties должен находиться в пути к классам. –

2

Хотя выше ответы на ваш вопрос. Я не уверен в этом. Позвольте мне разработать один на один:

@Configuration: Вы можете иметь конфигурацию пружины, двумя способами. a) Использование файла xml. b) И с использованием класса Java Configuration.

Чтобы использовать Java-класс в качестве файла конфигурации для весны, вам нужно добавить аннотацию @Configuration. В этом классе конфигурации теперь вы можете указать beans с помощью тега @Bean. Укажите область как singleton or prototype, используя аннотацию @Scope. И все, что вы можете сделать, используя файл конфигурации xml.

Кроме того, широкое сообщество не любит использовать xmls для конфигураций и, следовательно, предпочитает настраивать весну в классах Java.

@EnableAutoConfiguration: от springboot рамки. Он автоматически настраивает обычные или ожидаемые конфигурации, которые впоследствии могут быть отменены. В основном это разумно настраивает стандартные компоненты по умолчанию, используя по умолчанию различные классы конфигурации Java для разных конфигураций по умолчанию.

Regarding externalising configuration: Вы можете использовать внешнюю конфигурацию для application.properties или application.yml. Следующее должно быть местоположение.

  1. Подкаталог A/config текущего каталога.
  2. Текущий каталог
  3. путь к классам/конфигурации пакета
  4. Путь к классам корень

выше упорядочены в порядке их старшинства. Следовательно, если каталог config присутствует в текущей директории проекта. Он имел бы наивысший приоритет.

Ниже я добавляю диаграмму дерева моего приложения. Может быть, это помогает.

[email protected]:~/Desktop/project/gradleSpringBoot$ tree 
. 
├── build.gradle 
├── gradleSpringBoot.iml 
└── src 
    ├── main 
    │   ├── groovy 
    │   │   └── org.test 
    │   │    ├── components 
    │   │    │   └── TestComponent.groovy 
    │   │    ├── configuration 
    │   │    │   └── BaseConfiguration.groovy 
    │   │    | 
    │   │    └── utils 
    │   │     ├── AppConfig.groovy 
    │   │     └── AppInfo.groovy 
    │   ├── java 
    │   │   └── org 
    │   │    └── test 
    │   │     ├── GradleSpringBootApplication.java 
    │   │     └── HelloController.java 
    │   └── resources 
    │    ├── application-qa.yml 
    │    ├── application-uat.yml 
    │    ├── application.properties 
    │    ├── application.yml 
    │    ├── static 
    │    └── templates 
    └── test 
     └── java 
      └── org 
       └── test 
        └── GradleSpringBootApplicationTests.java 

Похоже, что у вас проблема с поиском и устранением неисправностей.

Давайте сделаем одно. Поместите файл конфигурации в ресурс, как в приведенной выше диаграмме дерева, и удалите его из всех других мест проекта. Причина этого заключается в том, что любой файл конфигурации в корневом каталоге или/config подкаталоге имеет более высокий приоритет и, следовательно, будет переопределять конфигурацию, которая находится в пути к классам.

+0

Спасибо за этот замечательный обзор. Теперь я ставлю свою конфигурацию под src/main/resources. Я думаю, что я вернусь к '@ Configuration' и' @ EnableAutoConfiguration' на более позднем этапе моего развития. Еще раз спасибо! (Мне тоже не нравится XML) – MonkeyMonkey