gpt4 book ai didi

java - Jersey:处理 Restful HTTP PUT(更新)请求的最佳实践

转载 作者:行者123 更新时间:2023-12-02 04:03:01 24 4
gpt4 key购买 nike

假设我有非常简单的User类:

@JsonIgnoreProperties({"password", "created", "lastModified"})
public class User {
public String id;
public String name;
public String password
public Long created;
public Long lastModified;
}

当我们将User实体序列化为JSON字符串时,我们会过滤掉passwordcreatedlastModified。然后前端的用户会更新用户名并将用户放回到我们的Restful服务中。

我的伪 Controller 方法处理 PUT 请求:

@Path("/user/{id}")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void saveUpdate(@PathParam("id")String id, User user) {
userService.save(user);
}

在上面的方法中,我希望 Jackson 能够反序列化前端发送到 POJO user 实例的 JSON 字符串,然后调用我们的服务来保存该实例。

到目前为止,一切看起来都很酷。然而,当我们将 user POJO 传递给 userService 来保存它时,就会出现问题。请记住,当我们将 user 序列化为 JSON 时,我们忽略了三个属性:passwordcreatedlastModified,并且我们必须从数据库获取那些缺失属性的值,然后与从前端发送的数据合并。

对于编码员来说,进行合并操作是一项非常简单但乏味的任务。我想知道是否有任何好的做法可以以简单而优雅的方式处理这种情况

最佳答案

我认为 User 对象是要保存到 DB 中的实体对象,因此最佳实践不是将实体对象暴露给 FE,而是使用仅包含 FE 需要了解的字段的 DTO 对象(考虑隐藏 id 和使用 UUID 代替,因为 id 值是可预测的)。稍后您可以使用 ModelMapper 将此类 DTO 对象映射到实体。因此您可以轻松地在 userDTO 和用户实体对象之间进行合并,然后仅保留实体,而不必担心丢失字段的状态

此外,如今许多 Web 服务都禁用其应用程序的 PUT 请求,而改用 POST。我不太了解原因,但这是我们将应用程序传递给安全检查时的安全问题之一

关于java - Jersey:处理 Restful HTTP PUT(更新)请求的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com