从另一个

时间:2017-07-11 14:59:38

标签: java spring controller

我有由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);
}
首先,这是一个好的设计吗?如果是的话,如何从控制器调用另一个控制器?

1 个答案:

答案 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)并返回从服务获得的值。