Исключить методы из @ModelAttribute в @RestControllerAdvice - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующий контроллер:

@RestController
@RequestMapping("/api/{brand}"
public class CarController {

  @GetMapping
  public List<Car> getCars(@PathVariable("brand") String brand) {
    // Some implementation
  }

  @GetMapping("/{model}")
  public Car getCar(@PathVariable("model") String model) {
    // Some implementation
  }

  @PostMapping("/{model}")
  public Car addCar(@PathVariable("model") String model), @RequestBody Car car) {
    // Some implementation
  }
}

И следующие RestControllerAdvice:

@RestControllerAdvice(assignableTypes = {CarController.class})
public class InterceptModelPathParameterControllerAdvice {

  @Autowired
  CarService carService;

  @ModelAttribute
  public void validateModel(@PathVariable("model") String model) {
    if (!carService.isSupportedModel(model)) throw new RuntimeException("This model is not supprted by this application.");
  }
}

validateModel правильно проверяет методы getCar и addCar, но он также проверяет метод getCars. Метод getCars не имеет {model} @PathVariable, поэтому запрос к этой конечной точке всегда приведет к RuntimeException.

Есть ли способ исключить влияние метода на комбинацию ControllerAdvice и ModelAttribute?

1 Ответ

0 голосов
/ 28 января 2020

Насколько я нашел, не существует реального способа исключить перехват метода методом @ModelAttribute в @ControllerAdvice. Однако вы можете изменить параметр метода с @PathVariable("model") String model на HttpServletRequest request и изменить реализацию следующим образом:

@ModelAttribute
public void validateModel(HttpServletRequest) {
  Map<String, String> requestAttributes = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
  if (requestAttributes.containsKey("model") {
    String model = requestAttributes.get("model");
    if (!carService.isSupportedModel(model)) throw new RuntimeException("This model is not supprted by this application.");
  }
}
...