【发布时间】:2019-10-22 10:57:56
【问题描述】:
当我的控制器中的方法返回 ModelAndView 时,我正在努力解决如何实现 API。我能找到的大多数教程都返回 ResponseEntities。我应该制作单独的 API 控制器来严格处理 /api 映射下的 API 调用吗? (我认为这不是 RESTFUL 做法)。或者是否可以在同一个控制器中处理我的 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);
}
【问题讨论】:
-
问题更多的是设计选择。
标签: spring rest api spring-boot spring-mvc