0

我正在玩 Quarkus 并尝试构建一个 CRUD REST 应用程序;我试图让 2 个端点返回相同实体的 2 个不同视图。这是一个关于我在 Spring + Jackson 中如何做的例子:

@Entity
public class Car{
  public String model;
  @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
  public Owner owner;
  // [...]
}

@Entity
public class Owner{
  public String name;
  // [...]
}

这是重要的部分:现在,如果我使用 Jackson,我将创建一个CarView类:

public class CarView {
  public static class Public {};
  public static class Private extends Public {};
}

有了这个,我会Car.model@JsonView(CarView.Public.class)Car.owner用注释@JsonView(CarView.Private.class),然后用相同的注释注释我在 REST 控制器中的方法,以便告诉杰克逊我想使用哪个视图:

@RequestMapping("/car/{id}")
@JsonView(CarView.Public.class)
public Car getPublic(@PathVariable int id) { /*...*/ }

@RequestMapping("/car/private/{id}")
@JsonView(CarView.Private.class)
public Car getPrivate(@PathVariable int id) { /*...*/ }

我可以使用 Quarkus 和 JSON-B 完成相同的结果吗?

4

1 回答 1

1

Quarkus 支持使用 JsonViews 来管理请求/响应的序列化/反序列化。

(只是让您知道,遗憾的是,smallry-openapi 实现(尚)不支持它,因此即使序列化有效,您仍然会大摇大摆地看到完整的模型。)

使用示例,取自官方指南https://quarkus.io/guides/resteasy-reactive#jsonview-support

可以对 JAX-RS 方法进行注释,@JsonView以便基于每个方法自定义返回的 POJO 的序列化。这最好用一个例子来解释。

的典型用途@JsonView是在某些方法上隐藏某些字段。在这种情况下,让我们定义两个视图:

public class Views {

    public static class Public {
    }

    public static class Private extends Public {
    }
}

假设我们有 User POJO,我们希望在序列化期间在其上隐藏一些字段。一个简单的例子是:

public class User {

    @JsonView(Views.Private.class)
    public int id;

    @JsonView(Views.Public.class)
    public String name;
}

根据返回此用户的 JAX-RS 方法,我们可能希望从序列化中排除 id 字段 - 例如,您可能希望不安全的方法不公开此字段。我们可以在 RESTEasy Reactive 中实现这一点的方式如下例所示:

@JsonView(Views.Public.class)
@GET
@Path("/public")
public User userPublic() {
    return testUser();
}

@JsonView(Views.Private.class)
@GET
@Path("/private")
public User userPrivate() {
    return testUser();
}

当 userPublic 方法的结果被序列化时,id 字段将不会包含在响应中,因为 Public 视图不包含它。然而,userPrivate 的结果将在序列化时包含预期的 id。

于 2021-12-22T10:09:00.953 回答