Получить URI из файла YAML в весеннем облачном шлюзе. свойство lateinit не инициализировано - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь настроить шлюз с помощью Spring Cloud Gateway. Сначала я использовал файл YAML для его настройки, но теперь мне нужно изменить тело ответа одного из маршрутов. Я уже сделал это. Следующий код является лишь примером того, что я пытаюсь сделать.

Проблема заключается в том, что мне нужно использовать тот же URI в файле YAML в конфигурации маршрута с использованием Kotlin DSL. Я получаю kotlin.UninitializedPropertyAccessException при попытке выполнить services.service["ms-two"], и это понятно. Но как я могу получить значение из YAML и использовать его внутри @Bean?

application.yml:

spring:
  profiles: local
  cloud:
    gateway:
      service:
        ms-one: http://localhost:8080
        ms-two: http://localhost:9000
      routes:
        - id: foo
          uri: ${spring.cloud.gateway.service.ms-one}
          predicates:
            - Path=/ms-one/foo
          filters:
            - RewritePath=/ms-one/foo, /foo
        - id: bar
          uri: ${spring.cloud.gateway.service.ms-two}
          predicates:
            - Path=/ms-two/bar
          filters:
            - RewritePath=/ms-two/bar, /bar

ServiceConfig.kt:

@Configuration
@ConfigurationProperties("spring.cloud.gateway")
class ServicesConfig {
    lateinit var service: Map<String, String>
}

RoutesApplication.kt:

@RestController
@SpringBootApplication
class RoutesApplication {

    @Autowired
    lateinit var services: ServicesConfig

    @Bean
    fun myRoutesLocal(builder: RouteLocatorBuilder): RouteLocator {
        return builder.routes().build()
    }

    @Bean
    fun kotlinBasedRoutes(routeLocatorBuilder: RouteLocatorBuilder): RouteLocator =
        routeLocatorBuilder.routes {
            route("baz") {
                uri(services.service["ms-two"])
                path("/ms-two/baz")
                filters {
                    rewritePath("/ms-two/baz", "/baz")
                    modifyResponseBody(String::class.java, String::class.java) { _, response ->
                        val newResponse = response + "..."
                        Mono.just(newResponse)
                    }
                }
            }
        }
}
...