为 RESTful 服务实现动态过滤

2025年1月17日 | 阅读时长:4分钟

在上一节中,我们执行了静态过滤。现在我们转向动态过滤。

在动态过滤中,我们根据需要为不同的服务定义不同的过滤器。 因此存在动态过滤的概念。

假设有三个字段:name、phone 和 salary。 我们希望为第一个服务发送两个字段:name 和 salary,为第二个服务发送 name 和 phone。

但是动态过滤存在一个限制。 我们无法直接在 bean 中配置动态过滤。 我们需要在检索值的地方开始配置过滤。 为了实现动态过滤,我们使用一个名为 MappingJacksonValue 的类。 如果我们查看类定义,我们会发现那里的过滤器方法定义。

让我们看看如何在我们的项目中实现动态过滤。

在下面的示例中,我们将为“/filtering”映射发送 name 和 salary。

步骤 1:打开 FilteringController.java 文件。

步骤 2:创建 MappingJacksonValue 类的构造函数,并将一个 bean (someBean) 作为构造函数参数传递。 我们想要为此特定 bean 创建一个 mapping Jackson 值。

步骤 3:要配置过滤器,我们需要创建它们。 要创建过滤器,请声明类型为 FilterProvider 的局部变量 filters。 FilterProvider 是一个抽象类。 它具有 SingleFilterProvider 方法的单一实现。 调用具有两个参数 String id 和 SimpleBeanPropretyFilter filter 的 addFilter() 方法。

步骤 4:调用 SimpleBeanPropertyFilter 类的静态方法 filterOutAllExcept()。 它会过滤掉响应中除了我们指定的字段之外的所有字段。 我们希望在响应中发送 name 和 salary 字段,因此我们指定了这两个字段。

步骤 5:配置过滤器。

步骤 6:不要返回 someBean,而是返回 mapping

步骤 7:我们已经返回了 mapping,因此我们需要将方法的返回类型更改为 MappingJacksonValue。

记住:有效过滤器的列表应在 bean 中定义。 如果我们不这样做,它将返回所有字段。

步骤 8:打开 SomeBean.java 文件,并使用注解 @JsonFilter 定义过滤器。 它在类级别使用。 它定义了一个过滤器名称,我们使用它来过滤掉 JSON 序列化中的属性。

SomeBean.java

让我们在第二个方法中实现动态过滤。 在此方法中,我们将为“/filtering-list”映射返回 name 和 phone 字段。

步骤 1:在此方法中,我们首先将方法的返回类型更改为 MappingJacksonValue。

步骤 2:创建一个 SomeBean 列表。

步骤 3:指定我们想要在响应中发送的字段名称。 在我们的例子中,我们指定了 namephone

步骤 4:将列表传递给 MappingJacksonValue 构造函数。

步骤 5:返回 mapping。

FilteringController.java

现在打开 REST 客户端 Postman 并使用 URI https://:8080/filtering 发送一个 GET 请求。 它会在响应中返回 name 和 salary 这两个字段,如下图所示。

Implementing Dynamic Filtering for RESTful Services

再次,使用 URI https://:8080/filtering-list 发送一个 GET 请求。 它会在响应中返回一个包含 name 和 phone 这两个字段的列表,如下图所示。

Implementing Dynamic Filtering for RESTful Services