Компонент RequestScoped для внедрения в функцию HandlerFunction - PullRequest
0 голосов
/ 29 октября 2018

Ниже приведена конфигурация маршрута для функции обработчика 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();
            }
         }
     }
}

1 Ответ

0 голосов
/ 29 октября 2018

Возможно, это был глупый вопрос, но мне потребовалось время, чтобы решить. Я только что создал новый компонент, сделал его с прототипом Scope, и он работает. Вот код.

@Component
@RefreshScope
@Scope("prototype")
public class RefreshComponent
{
    private static final Logger logger = LoggerFactory.getLogger(RefreshComponent.class);

    @Value("${originairports.shutdown}")
    String airports;

    public String originAirports()
    {
        logger.info("Origin Airports in shutdown " + airports);
        return new String(airports);
    }

}
...