为RESTful服务实现动态过滤

在上一节中, 我们执行了静态过滤。现在, 我们转向动态过滤。
在动态过滤中, 我们根据需要为不同的服务定义了不同的过滤器。因此存在动态过滤的概念。
假设有三个字段:姓名, 电话和薪水。我们要发送两个字段:第一个服务的名称和薪水, 第二个服务的名称和电话。
但是动态过滤存在局限性。我们不能直接在bean中配置动态过滤。我们需要在获取值的地方开始配置过滤。为了实现动态过滤, 我们使用一个名为MappingJacksonValue的类。如果查看类定义, 则会在其中找到过滤器方法定义。
让我们看看如何在我们的项目中实现动态过滤。
在以下示例中, 我们将为“ /过滤”映射发送名称和薪水。
步骤1:打开FilteringController.java文件。
步骤2:创建MappingJacksonValue类的构造函数, 并传递一个bean(someBean)作为构造函数参数。我们要为此特定的bean创建一个映射Jackson值。

MappingJacksonValue mapping = new MappingJacksonValue (someBean);

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

步骤4:调用SimpleBeanPropertyFilter类的静态方法filterOutAllExcept()。它过滤响应中的所有字段, 除了我们指定的字段。我们想在响应中发送姓名和薪水字段, 因此我们指定了这两个字段。
SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "salary");

步骤5:配置过滤器。
mapping.setFilters(filters);

第6步:代替返回someBean返回映射。
return mapping;

步骤7:我们已经返回了映射, 因此我们需要将方法的返回类型更改为MappingJacksonValue。
public MappingJacksonValue retrieveSomeBean()@RequestMapping("/filtering")public MappingJacksonValue retrieveSomeBean(){SomeBean someBean=new SomeBean("Amit", "9999999999", "39000"); //invoking static method filterOutAllExcept()SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "salary"); //creating filter using FilterProvider classFilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter", filter); //constructor of MappingJacksonValue classthat has bean as constructor argumentMappingJacksonValue mapping = new MappingJacksonValue(someBean); //configuring filtersmapping.setFilters(filters); return mapping; }

切记:有效过滤器的列表应在Bean中定义。如果我们不这样做, 它将返回所有字段。
步骤8:打开SomeBean.java文件, 并使用注释@JsonFilter定义过滤器。它在班级使用。它定义了一个过滤器名称, 我们可以在JSON序列化中过滤掉属性。
@JsonFilter("SomeBeanFilter")

SomeBean.java
package com.srcmini.server.main.filtering; import com.fasterxml.jackson.annotation.JsonFilter; @JsonFilter("SomeBeanFilter")public class SomeBean {privateString name; privateString phone; //JsonIgnore indicates that the annotated method or field is to be ignored//@JsonIgnoreprivateString salary; //generating constructorpublic SomeBean(String name, String phone, String salary) {super(); this.name = name; this.phone = phone; this.salary = salary; }public String getName() {return name; }public void setName(String name) {this.name = name; }public String getPhone() {return phone; }public void setPhone(String phone) {this.phone = phone; }public String getSalary() {return salary; }public void setSalary(String salary) {this.salary = salary; }}

让我们在第二种方法中实现动态过滤。在这种方法中, 我们将返回“ / filtering-list”映射的名称和电话字段。
步骤1:在此方法中, 我们首先将方法的返回类型更改为MappingJacksonValue。
步骤2:创建SomeBean列表。
List< SomeBean> list=Arrays.asList(new SomeBean("Saurabh", "8888888888", "20000"), new SomeBean("Devesh", "1111111111", "34000"));

步骤3:指定我们要在响应中发送的字段名称。在本例中, 我们指定了名称和电话。
SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone");

步骤4:在MappingJacksonValue构造函数中传递列表。
步骤5:返回映射。
@RequestMapping("/filtering-list")public MappingJacksonValue retrieveListOfSomeBeans(){List< SomeBean> list=Arrays.asList(new SomeBean("Saurabh", "8888888888", "20000"), new SomeBean("Devesh", "1111111111", "34000")); //invoking static method filterOutAllExcept()SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone"); FilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter", filter); //constructor of MappingJacksonValue class that has list as constructor argumentMappingJacksonValue mapping = new MappingJacksonValue(list); //configuring filtermapping.setFilters(filters); return mapping; }

FilteringController.java
package com.srcmini.server.main.filtering; import java.util.Arrays; import java.util.List; import org.springframework.http.converter.json.MappingJacksonValue; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; import com.fasterxml.jackson.databind.ser.FilterProvider; @RestControllerpublic class FilteringController {//returning a single bean as response//values to send name and salary@RequestMapping("/filtering")public MappingJacksonValue retrieveSomeBean(){SomeBean someBean=new SomeBean("Amit", "9999999999", "39000"); //invoking static method filterOutAllExcept()SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "salary"); //creating filter using FilterProvider classFilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter", filter); //constructor of MappingJacksonValue classthat has bean as constructor argumentMappingJacksonValue mapping = new MappingJacksonValue(someBean); //configuring filtersmapping.setFilters(filters); return mapping; }//returning a list of SomeBeans as response//values to send name and phone@RequestMapping("/filtering-list")public MappingJacksonValue retrieveListOfSomeBeans(){List< SomeBean> list=Arrays.asList(new SomeBean("Saurabh", "8888888888", "20000"), new SomeBean("Devesh", "1111111111", "34000")); //invoking static method filterOutAllExcept()SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone"); FilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter", filter); //constructor of MappingJacksonValue class that has list as constructor argumentMappingJacksonValue mapping = new MappingJacksonValue(list); //configuring filtermapping.setFilters(filters); return mapping; }}

现在, 打开REST Client Postman并使用URI http:// localhost:8080 / filtering发送GET请求。它在响应中返回两个字段名称和薪水, 如下图所示。
为RESTful服务实现动态过滤

文章图片
【为RESTful服务实现动态过滤】同样, 发送带有URI http:// localhost:8080 / filtering-list的GET请求。它将在响应中返回一个包含两个字段名称和电话的列表, 如下图所示。
为RESTful服务实现动态过滤

文章图片

    推荐阅读