Ниже приведена конфигурация маршрута для функции обработчика webflux. Я использую Spring Cloud Config для получения свойств. Здесь у меня есть динамическое свойство originairports.shutdown
, которое часто изменяется в файле свойств и вставляется в переменную String airports
с использованием @Value("${originairports.shutdown}") String airports
всякий раз, когда я даю /actuator/bus-refresh
http POST сервису. Для этого я дал аннотацию @RefreshScope
. Затем я преобразовываю разделенную запятыми строку в список и регистрирую ее как компонент в области запроса, потому что я хочу новый компонент при динамическом изменении значения.
@Configuration
@RefreshScope
public class SearchRoutes
{
@Value("${originairports.shutdown}")
String airports;
@Bean
@Scope(scopeName = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public List<String> originAirports()
{
logger.info("Origin Airports in shutdown " + airports);
return Arrays.asList(airports.split(","));
}
@Bean
RouterFunction<ServerResponse> search()
{
RouterFunction<ServerResponse> searchRoutes = RouterFunctions.route(POST("/search/get"),
searchHandler.search);
return searchRoutes;
}
}
Ниже приведен код класса Handler, где I @Autowire
bean-компонент, проверяющий значение и возвращающий ответ соответствующим образом. Приложение отлично загружается, но когда я даю запрос, я получаю ошибку java.lang.IllegalStateException: No Scope registered for scope name 'request'
. Так в чем же проблема с этим кодом?
@Component
public class SearchHandler
{
@Autowired
private List<String> originAirports;
public HandlerFunction<ServerResponse> search = request ->
{
Mono<SearchQuery> searchQuery = request.bodyToMono(SearchQuery.class);
return searchQuery.flatMap(sq ->
{
if (originAirports.contains(sq.getOrigin()))
{
logger.info("The origin airport " + sq.getOrigin() + " is in shutdown state");
return ServerResponse.notFound()
.build();
}
}
}
}