【问题标题】:Call a Spring Controller from another one从另一个调用 Spring Controller
【发布时间】:2017-07-11 14:59:37
【问题描述】:

我有由 UserController 处理的 URL /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);
}

首先,这是一个好的设计吗?如果是,我如何从一个控制器调用另一个控制器?

【问题讨论】:

  • 我相信您可以简单地定义另一个具有适当映射的控制器。 Spring 应该使用与您的 URI 匹配的最具体的请求映射。
  • 您需要的是服务而不是另一个控制器或存储库。
  • ..is ImageController 已经“到位”..并且(如果,)它映射到什么请求路径?
  • @xerx593,不,还没有实现任何东西。我只是想先设计所有这些。
  • @efekctive,在UserController 类中调用imageService.getByUsers(userId) 是不是一个好设计?还是我应该做userService.getImages(id)

标签: java spring controller


【解决方案1】:

您不能从控制器调用另一个控制器,因为前端控制器 (Dispatcher Servlet) 正在编排所有请求。根据您的 URI 请求,将通过匹配的控制器/请求处理程序来处理。因此,您可以使用来自重定向控制器的 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)并返回从服务获取的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2014-01-24
    • 1970-01-01
    • 2018-02-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多