【问题标题】:Is there an equivalent of Jackson + Spring's `@JsonView` using Quarkus + JSONB?使用 Quarkus + JSONB 是否有相当于 Jackson + Spring 的`@JsonView`?
【发布时间】:2020-12-22 20:27:44
【问题描述】:

我正在玩 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 {};
}

然后我会用 @JsonView(CarView.Public.class)Car.owner@JsonView(CarView.Private.class) 注释 Car.model,然后在 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 实现相同的结果吗?

【问题讨论】:

    标签: java spring jackson quarkus jsonb-api


    【解决方案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 {
        }
    }
    

    假设我们有一个用户 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。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2016-11-13
      • 2015-10-30
      • 2016-06-03
      • 2019-02-27
      • 2018-01-31
      • 1970-01-01
      • 2020-07-03
      • 2013-11-07
      相关资源
      最近更新 更多