使用PUT请求对实体进行单变量更新

时间:2017-09-11 21:54:05

标签: java rest web-services

我有一个User实体,如下所示:

public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    @NotNull
    @Size(min = 5, max = 50)
    @Pattern(regexp = RegexConstants.EMAIL_REGEX, message = ValidationMessages.EMAIL_VALIDATION_MESSAGE)
    @Column(name = "email", unique = true)
    private String email;

    @NotNull
    @Size(min = 5, max = 50)
    @Column(name = "password")
    private String password;

    @NotNull
    @Size(min = 5, max = 50)
    @Column(name = "country_code")
    private String countryCode;


    /* Getters and Setters */

}

我想只更新用户的国家/地区代码。 我想使用 PUT 请求,因为这似乎是一个合适的选择(不要因为在这里使用适当的词而讨厌我,我可能错了)但是在请求体中发送用户似乎是一种过度杀戮,因为我不打算更新除国家代码之外的任何内容。 当我提出请求时,我实际上甚至没有整个用户。用户正文(@RequestBody user)仅包含namecountry code

因此,基于我读过的有关PUT请求的内容,我需要在请求中发送完整的用户对象,而我还没有。现在我可以通过简单地在URL中传递国家代码来实现这一点,但我在RESTful Web服务上阅读的所有文章都建议不要这样做。

当前代码:

@RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)
    public ResponseEntity<User> updateUser(@PathVariable("id") long id, @RequestBody User user) {
        System.out.println("Updating User " + id);

        User currentUser = userService.findById(id);

        if (currentUser==null) {
            System.out.println("User with id " + id + " not found");
            return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
        }

        currentUser.setCountryCode(user.getCountryCode);

        userService.updateUser(currentUser);
        return new ResponseEntity<User>(currentUser, HttpStatus.OK);
    }

如果有人能指导正确的方法,我真的很感激。我已经阅读了有关PATCH请求的内容,但我不确定这是否适合我的情况。 如果我做错了,如果你也可以提供一个例子,或者给我一个关于如何以正确的格式采取这个的起点,这将非常有用。

0 个答案:

没有答案