Я изо всех сил пытаюсь реализовать API, когда методы в моем контроллере возвращают ModelAndView. Большинство учебных пособий, которые я могу найти, возвращают ResponseEntities. Должен ли я делать отдельные контроллеры API, которые строго обрабатывают вызовы API в соответствии с / api-отображением? (Который я верю, не является ОТДЫХНОЙ практикой). Или можно обрабатывать мои вызовы API в одном контроллере, даже когда используется ModelAndView?
Мой контроллер выглядит следующим образом:
@RestController
@RequestMapping("/dish")
public class DishController {
private final DishRepository dishRepository;
public DishController(DishRepository dishRepository) {
this.dishRepository = dishRepository;
}
@GetMapping
public ModelAndView list() {
Iterable<Dish> dishes = this.dishRepository.findAll();
return new ModelAndView("dishes/list", "dishes", dishes);
}
@GetMapping("{id}")
public ModelAndView view(@PathVariable("id") Dish dish) {
return new ModelAndView("dishes/view", "dish", dish);
}
@GetMapping(params = "form")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String createForm(@ModelAttribute Dish dish) {
return "dishes/form";
}
@ResponseStatus(HttpStatus.CREATED)
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
public ModelAndView create(@Valid Dish dish, BindingResult result,
RedirectAttributes redirect) {
if (result.hasErrors()) {
return new ModelAndView("dishes/form", "formErrors", result.getAllErrors());
}
dish = this.dishRepository.save(dish);
redirect.addFlashAttribute("globalMessage", "view.success");
return new ModelAndView("redirect:/d/{dish.id}", "dish.id", dish.getId());
}
@RequestMapping("foo")
public String foo() {
throw new RuntimeException("Expected exception in controller");
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("delete/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public ModelAndView delete(@PathVariable("id") Long id) {
this.dishRepository.deleteById(id);
Iterable<Dish> dishes = this.dishRepository.findAll();
return new ModelAndView("dishes/list", "dishes", dishes);
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("/modify/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public ModelAndView modifyForm(@PathVariable("id") Dish dish) {
return new ModelAndView("dishes/form", "dish", dish);
}