2016-11-29 62 views
0

我有一个春天@RestController操纵我的用户,我想有几个功能:
弹簧安置控制器具有不同的功能

  • /用户:GET(返回所有用户)
  • /用户/:ID :GET(返回与给定的ID,默认ID = 1的用户)
  • /用户:POST(插入用户)
  • /用户/:ID:DELETE(删除用户与给定的ID)

我开始研究它,但我不确定如何管理同一方法的“重叠”URI(例如,前两种情况)。这里是我想出了迄今:

@RestController 
public class UserController { 
    @RequestMapping(value = "/users", method = RequestMethod.GET) 
    public List<User> getAllUsers() { 
     return UserDAO.getAll(); 
    } 

    @RequestMapping(value = "/users", method = RequestMethod.GET) 
    public User getUser(@RequestParam(value = "id", defaultValue = "1") int id) { 
     return UserDAO.getById(id); 
    } 
} 

这不会工作,由于“暧昧映射”,它是很清楚的给我,但我不知道该怎么办。我应该更改其中一个URI还是有其他方法?

编辑: 我也试图改变第二种方法:

@RequestMapping(value = "https://stackoverflow.com/users/{id}", method = RequestMethod.GET) 
public User getUser(@PathVariable("id") int id) { 
    return UserDAO.getById(id); 
} 

还不行。

+3

如果你想映射想要的'/ users /:id',你应该定义一个'@RequestMapping(value =“/ users/{id}”,method = RequestMethod.GET)'并且用{{id}一个'@PathVariable int id'。 –

+0

@AliDehghani看看我的编辑...它仍然不起作用 – vtomic85

+1

你是什么意思'仍然无法正常工作..'?如果得到任何异常,请发布完整的堆栈跟踪... –

回答

3

您当前的映射:

@RequestMapping(value = "/users", method = RequestMethod.GET) 
public User getUser(@RequestParam(defaultValue = "1") int id) 

将映射到/users?id=42不是期望/users/42。如果你想创建一个映射/users/:id端点,使用以下命令:

@RequestMapping(value = "https://stackoverflow.com/users/{id}", method = RequestMethod.GET) 
public User getUser(@PathVariable int id) { 
    return UserDAO.getById(id); 
} 

而且,Spring框架4.3的,你可以使用new meta annotations处理GETPOST等方法:

@RestController 
@RequestMapping("/users") 
public class UserController { 
    @GetMapping 
    public List<User> getAllUsers() { 
     return UserDAO.getAll(); 
    } 

    @GetMapping("{id}") 
    public User getUser(@PathVariable int id) { 
     return UserDAO.getById(id); 
    } 
} 
+1

有用的meta注释 – sura2k

+0

@ sura2k然后[this](https://github.com/sbrannen/spring-composed)也许听起来很有趣。 –