在API类

时间:2017-09-26 06:37:33

标签: java rest spring-boot api-design

我正在使用Spring Boot(1.5.3)来创建Spring REST Web服务。我添加了spring-boot-starter-web作为唯一的依赖项(根据春季指南)。接下来,我为我的服务类创建了UserManagementService接口。

@RequestMapping("/usermanagement/v1")
public interface UserManagementService {

    @RequestMapping(value = "/user/{id}/", method=RequestMethod.GET)
    public UserTo getUserById(@PathVariable("id") long id);

    @RequestMapping(value = "/users/", method=RequestMethod.GET)
    public List<UserTo> getAllUsers();
}

及其实施UserManagementServiceImpl

@RestController
public class UserManagementServiceImpl implements UserManagementService {

    private Map<Integer, UserTo> users;

    public UserManagementServiceImpl() {
        users = new HashMap<>();
        users.put(1, new UserTo(1, "Smantha Barnes"));
        users.put(2, new UserTo(2, "Adam Bukowski"));
        users.put(3, new UserTo(3, "Meera Nair"));
    }

    public UserTo getUserById(long id) {
        return users.get(id);
    }

    public List<UserTo> getAllUsers() {
        List<UserTo> usersList = new ArrayList<UserTo>(users.values());
        return usersList;
    }

}

我想用最少配置的Spring Boot创建一个REST Web服务,并认为这样可行。但在访问我的Web服务时,我收到了无响应。我缺少什么?

此外,我已经看到许多项目,其中注释被添加到接口而不是实现类。我认为这比注释类更好。它应该在这里工作,对吗?

1 个答案:

答案 0 :(得分:0)

作为mentioned in the comments,并非接口上都支持所有注释。例如@PathVariable注释将不起作用,因此您必须将其放在实现本身上:

public UserTo getUserById(@PathVariable("id") long id) {
    return users.get(id);
}

除此之外,您还有一个Map<Integer, UserTo>,但您正在使用类型为@PathVariable的{​​{1}}检索用户。这也不起作用,因此要么将long的密钥更改为users,要么将Long参数更改为id

int

原因是public UserTo getUserById(@PathVariable("id") int id) { return users.get(id); } 1L)与long1)不同。因此,检索映射条目不会返回int值的任何结果。