Я пытаюсь настроить шлюз с помощью 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)
}
}
}
}
}