我有由UserController处理的网址/users
和/users/58
。
现在,我想将/users/58/images
重定向到ImageController,以便将有关Images的所有代码移动到ImageController。
以下是UserController的样子:
@RequestMapping(method = RequestMethod.GET, value = "/users")
List<User> paginate() { ... }
@RequestMapping(method = RequestMethod.GET, value = "/users/{id}")
List<User> get(Long id) { ... }
@RequestMapping(method = RequestMethod.GET, value = "/users/{id}/images")
List<Image> images(Long userId) {
// What I want to do is something like this
ImageController images = new ImageController();
return images.getByUser(userId);
}
首先,这是一个好的设计吗?如果是的话,如何从控制器调用另一个控制器?
答案 0 :(得分:0)
您无法从控制器调用另一个控制器,因为Front Controller(Dispatcher Servlet)正在编排所有请求。基于您的URI请求将通过匹配Controller / Request Handler来处理。因此,您可以通过重定向控制器重定向URI并在重定向的控制器中获取该URI。示例(处理程序方法不必位于同一个控制器中)
重定向控制器的处理程序
@RequestMapping(method = RequestMethod.GET, value = "/users/{id}/images")
public String getUserId() {
return "redirect:/getUsersPage/{id}";
}
重定向控制器中的处理程序
@Autowired
ImageService imageService;
@RequestMapping(value = "/getUsersPage/{id}", method = RequestMethod.GET)
public String getUsersPage(@PathVariable Long id, Model model) {
return imageService.getByUser(id);;
}
关于设计:如果它是一个REST服务并且没有前端,那么您的请求处理程序正在返回消息体,您可以注入服务(比如imageService)并返回从服务获得的值。