“链接”两个控制器?

时间:2013-08-22 07:59:53

标签: java rest spring-mvc

我正在开发的REST-API允许访问各种用户数据。

可以通过他们的ID,他们的电子邮件或用户名识别用户。然后,用户还有一些其他数据,例如订单等。

现在我打算公开以下端点:

  • /rest/user/byemail/test@example.org/profile
  • /rest/user/byemail/test@example.org/orders
  • /rest/user/byemail/test@example.org/address
  • /休息/用户/ byid / 123456 /简档
  • /休息/用户/ byid / 123456 /订单
  • /休息/用户/ byid / 123456 /地址
  • /休息/用户/ byusername /测试/简档
  • /休息/用户/ byusername /测试/订单
  • /休息/用户/ byusername /测试/地址

正如您所看到的,URL总是包含两个"部分":一个用于识别用户,另一个用于识别资源。

如果我现在可以避免在我的控制器中编写9种不同的方法(因为将来可能会有其他类型的信息),那将是很棒的。

是否有可能编写一个UserController然后由MainController返回并参数化?

public class UserController {
   @RequestMapping("/profile")
   public ModelAndView profile(User user) {
      //...
   }
   @RequestMapping("/orders")
   public ModelAndView profile(User user) {
      //...
   }
   @RequestMapping("/address")
   public ModelAndView profile(User user) {
      //...
   }
}

@RequestMapping("/rest/user")
public class MainController {
   @RequestMapping("byemail/{email}")
   public ??? byEmail(@PathVariable String email) {
       User user = //Find user by email
       //???
   }
   @RequestMapping("byusername/{username}")
   public ??? byUserName(@PathVariable String username) {
       User user = //Find user by username
       //???
   }
   @RequestMapping("byid/{id}")
   public ??? byId(@PathVariable String id) {
       User user = //Find user by id
       //???
   }
}

或者是否可以通过某种路由来解决这个问题? 然而,重要的是"分裂" URL并使用一半来查找正确的用户,然后在解析下半部分时将其用作参数。

2 个答案:

答案 0 :(得分:2)

为什么不只有一个带有这些请求映射的控制器?

@RequestMapping("/rest/user")
public class UserController {

   @RequestMapping("{keyType}/{key}/orders")
   public ModelAndView orders(@PathVariable String keyType, @PathVariable String key) {
       User u = findUser(keyType, key);
       // ...
   }

   @RequestMapping("{keyType}/{key}/profile")
   public ModelAndView profile(@PathVariable String keyType, @PathVariable String key) {

       User u = findUser(keyType, key);
       // ...
   }

   @RequestMapping("{keyType}/{key}/address")
   public ModelAndView address(@PathVariable String keyType, @PathVariable String key) {
       User u = findUser(keyType, key);
       // ...
   }

   private User findUser(String keyType, String key) {
       // ...
   }
}

答案 1 :(得分:0)

看看Spring Data REST

此API向网络公开SimpleJpaRespository,可通过RESTful路径访问。