gpt4 book ai didi

java - 使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:09 24 4
gpt4 key购买 nike

我正在寻找一种将一些 JPA 实体导出到 REST API 的方法,而不是每次我想根据入口点共享一些特定字段时发送整个实体。这是一个小例子:

假设我们有一个只有几个字段的 Author 类:

@Entity
public class Author implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = SEQUENCE)
private Long id;

@NotNull
@Size(min = 1, message = "{required.field}")
private String name;

@NotNull
@Size(min = 1, message = "{required.field}")
private String country;

private LocalDate birthDate;

// getters and setters
}

假设我们有这个 REST 服务(只有两种方法):

@Path("authors")
public class AuthorREST {

@Inject
private AuthorBC bc;

@GET
@Produces("application/json")
public List<Author> find(@QueryParam("q") String query) throws Exception {

List<Author> result;

if (Strings.isEmpty(query)) {
result = bc.findAll();
} else {
result = bc.find(query);
}
return result;
}

@GET
@Path("{id}")
@Produces("application/json")
public Author load(@PathParam("id") Long id) throws Exception {

Author result = bc.load(id);

if (result == null) {
throw new NotFoundException();
}

return result;
}
}

现在,通过这种方式,当我的 API 被调用时,我将始终拥有 4 个字段。

我明白,如果我使用 Jackson,我可以为我想忽略的字段设置一个 @JsonIgnore,它们将始终被忽略。

但是,如果我希望在某些情况下,我的整个实体由一项服务返回,而在其他服务(或同一服务中的其他方法)中,仅返回 2 或 3 个字段怎么办?

有办法吗?

最佳答案

@JsonView 和混入

您已经知道可以使用 @JsonIgnore 等注释和 @JsonIgnoreProperties让 Jackson 忽略一些属性。

您还可以检查 @JsonView注解。有关如何使用 @JsonView 的一些详细信息使用 JAX-RS,看看 here .

如果修改 JPA 实体不是一个选项,请考虑在 answer 中描述的混入注释.

数据传输对象

Data Transfer Object (DTO) 是一种以明确定义的目的创建的模式:将数据传输到远程接口(interface),就像 web 服务 一样。这种模式非常适合 REST API,使用 DTO 从长远​​来看,您将拥有更多灵 active 。一旦 REST 资源表示不需要具有与持久性对象相同的属性,您就可以根据需要定制类。

为避免样板代码,您可以使用映射框架,例如 MapStruct将您的 REST API DTO 从/映射到您的持久性对象。

有关使用 DTO 的好处的详细信息,请查看以下答案:

要为您的 DTO 提供更好的名称,请检查以下答案:

关于java - 使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38233238/

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