Отображение контроллера Spring REST на основе значения параметра - PullRequest
0 голосов
/ 27 декабря 2018

В контроллере Spring REST возможно ли иметь метод обработчика, основанный на значении параметра запроса?

Например, я хочу, чтобы метод обработчика вызывался только тогда, когда значение параметра typeэто продукт.

http://localhost:8080/api/vi/catalog?type=product

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я думаю, что лучший подход - привязать HandlerInterceptor к пути "/ api / vi / catalog".Вот пример: Interceptor возвращает ответ 404, если для параметра не задано значение product:

@Component
public class ProductInterceptorHandler implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    if (!request.getParameter("type").equalsIgnoreCase("product")){
        response.setStatus(404);
        // DO WHATEVER YOU WANT TO INFORM USER THAT IS INVALID
        return false;
    }
    return true;
}

}

И вы должны привязать его к пути внутри вашего класса конфигурации (в моем случае SpringBootApplicationкоторый расширяет WebMvcConfigurerAdapter):

@SpringBootApplication

public class ASpringApplication extends WebMvcConfigurerAdapter implements CommandLineRunner {

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



@Override
public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(new ProductInterceptorHandler()).addPathPatterns("/api/vi/catalog");
}
}

И, наконец, метод restcontroller:

@RequestMapping(value = "/api/vi/catalog", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> searchLocationIndexed(@RequestParam("type") String type ) throws Exception {

    return ResponseEntity.ok("ok");
}
0 голосов
/ 27 декабря 2018

Spring только соответствует запросу на основе пути и параметров запроса.

Я думаю, что в вашем случае вы должны попробовать другой подход, например: /api/v1/catalog/product более разумно в этом случае.

...