2016-08-03 2 views
5

Я настроил Spring Cloud Config сервер, как это:Spring config config server. Переменные окружения в свойствах

@SpringBootApplication 
@EnableAutoConfiguration 
@EnableConfigServer 
public class ConfigServer { 

    public static void main(String[] args) { 
     SpringApplication.run(ConfigServer.class, args); 
    } 
} 

Я использую «родной» профиль, чтобы свойства подобраны из файловой системы:

server.port=8888 
spring.profiles.active=native 
spring.cloud.config.server.native.search-locations: classpath:/global 

Сейчас сложно что некоторые свойства содержат переменные окружения. Свойства в «глобальный/application-production.properties» настроены так:

test=${DOCKER_HOST} 

Когда пускаю Config сервера - все работает отлично. Однако, когда я достигаю http://localhost:8888/testapp/production я вижу это:

{ 
    name: "testapp", 
    profiles: [ 
     "production" 
], 
    label: null, 
    version: null, 
    propertySources: [ 
     { 
      name: "classpath:/global/application-production.properties", 
      source: { 
       test: "${DOCKER_HOST}" 
      } 
     } 
    ] 
} 

Так значение из переменной ENV не заменяющие $ {DOCKER_HOST} положить, а возвращается как есть.

Но если доступ http://localhost:8888/application-production.properties, то результат будет не JSON, но довольно простой текст:

test: tcp://192.168.99.100:2376 

Spring документация говорит:

Представления YAML и свойства имеют дополнительный флаг (при условии, как логическое параметр запроса resolvePlaceholders), чтобы сигнализировать, что заполнители в исходных документах в стандартной форме Spring $ {...} должны быть разрешены на выходе, где это возможно, перед рендерингом. Это полезная функция для потребителей, которые не знают о соглашениях о пружинных пружинах.

По какой-то причине resolvePlaceholders не работает для представления JSON, таким образом, сервер конфигурации клиенты должны быть осведомлены обо всех переменных ENV, настроенных на сервере.

Можно ли заставить JSON-представление resolvePlaceholders так же, как и текст (свойства) представления?

ответ

0

Для выполнения этой задачи в следующем объединении enter link description here я нашел реализацию для resolvePlaceholders. Это дало мне идею, что я просто создаю новый контроллер, который использует EnvironmentController. Это позволит вам решить конфигурацию, это хороший бутстрап.

import com.fasterxml.jackson.databind.ObjectMapper; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.cloud.config.server.environment.EnvironmentController; 
import org.springframework.cloud.config.server.environment.EnvironmentRepository; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
@RequestMapping(method = RequestMethod.GET, path = "resolved/${spring.cloud.config.server.prefix:}") 
public class ReplacedEnvironmentController { 

    private EnvironmentController environmentController; 

    @Autowired 
    public ReplacedEnvironmentController(EnvironmentRepository repository) { 
    environmentController = new EnvironmentController(repository, new ObjectMapper()); 
    } 

    public ReplacedEnvironmentController(EnvironmentRepository repository, 
     ObjectMapper objectMapper) { 
    environmentController = new EnvironmentController(repository, objectMapper); 

    } 

    @RequestMapping("/{name}/{profiles:.*[^-].*}") 
    public ResponseEntity<String> resolvedDefaultLabel(@PathVariable String name, 
     @PathVariable String profiles) throws Exception { 
    return resolvedLabelled(name, profiles, null); 
    } 

    @RequestMapping("/{name}/{profiles}/{label:.*}") 
    public ResponseEntity<String> resolvedLabelled(@PathVariable String name, @PathVariable String profiles, 
     @PathVariable String label) throws Exception { 
    return environmentController.labelledJsonProperties(name, profiles, label, true); 
    } 

} 
Смежные вопросы