📜  为RESTful服务实现动态过滤

📅  最后修改于: 2021-01-12 01:01:29             🧑  作者: Mango

为RESTful服务实现动态过滤

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

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

假设有三个字段:姓名,电话和薪水。我们要发送两个字段:第一个服务的名称和薪水,第二个服务的名称和电话。

但是动态过滤存在局限性。我们不能直接在bean中配置动态过滤。我们需要在获取值的地方开始配置过滤。为了实现动态过滤,我们使用了一个名为MappingJacksonValue的类。如果查看类定义,则会在其中找到过滤器方法定义。

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

在下面的示例中,我们将为“ / filtering ”映射发送名称和薪水。

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

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

MappingJacksonValue mapping = new MappingJacksonValue (someBean);

步骤3:要配置过滤器,我们需要创建它们。要创建过滤器,请声明FilterProvider类型的局部变量过滤器。 FilterProvider是一个抽象类。它具有SingleFilterProvider方法的单个实现。调用具有两个参数String id和SimpleBeanPropretyFilter filter的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 class
FilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter",filter);
//constructor of MappingJacksonValue class  that has bean as constructor argument
MappingJacksonValue mapping = new MappingJacksonValue(someBean);
//configuring filters
mapping.setFilters(filters);
return mapping;
}

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

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

@JsonFilter("SomeBeanFilter")

SomeBean.java

package com.javatpoint.server.main.filtering;
import com.fasterxml.jackson.annotation.JsonFilter;
@JsonFilter("SomeBeanFilter")
public class SomeBean 
{
private  String name;
private  String phone;
//JsonIgnore indicates that the annotated method or field is to be ignored
//@JsonIgnore
private  String salary;
//generating constructor
public 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 list=Arrays.asList(new SomeBean("Saurabh", "8888888888","20000"), new SomeBean("Devesh", "1111111111","34000"));

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

SimpleBeanPropertyFilter filter=SimpleBeanPropertyFilter.filterOutAllExcept("name", "phone");

步骤4:在MappingJacksonValue构造函数中传递列表。

步骤5:返回映射。

@RequestMapping("/filtering-list")
public MappingJacksonValue retrieveListOfSomeBeans()
{
List 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 argument
MappingJacksonValue mapping = new MappingJacksonValue(list);
//configuring filter
mapping.setFilters(filters);
return mapping;
}

FilteringController.java

package com.javatpoint.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;
@RestController
public 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 class
FilterProvider filters=new SimpleFilterProvider().addFilter("SomeBeanFilter",filter);
//constructor of MappingJacksonValue class  that has bean as constructor argument
MappingJacksonValue mapping = new MappingJacksonValue(someBean);
//configuring filters
mapping.setFilters(filters);
return mapping;
}
//returning a list of SomeBeans as response
//values to send name and phone
@RequestMapping("/filtering-list")
public MappingJacksonValue retrieveListOfSomeBeans()
{
List 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 argument
MappingJacksonValue mapping = new MappingJacksonValue(list);
//configuring filter
mapping.setFilters(filters);
return mapping;
}
}

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

同样,发送带有URI http:// localhost:8080 / filtering-list的GET请求。它将在响应中返回一个包含两个字段名称和电话的列表,如下图所示。