实现 RESTful 服务的静态过滤

在本节中,我们将学习如何对请求进行过滤。

过滤器是 JAX-RS 框架提供的重要功能之一。它在各种上下文中使用。它可以应用于对资源的请求或来自资源的响应,或者两者兼而有之。

考虑这样一个场景,在响应中我们不想显示某些类成员。这个过程称为过滤。Jackson 有两个用于过滤的注解:@JsonIgnore@JsonIgnoreProperties

@JsonIgnore

这是一个成员或方法级别的注解。它要求要排除的属性逐个进行标记。如果我们想要在序列化和反序列化过程中排除某个成员,我们可以在实际属性或其设置器或获取器上注解。

让我们创建一个用于过滤响应的过滤器。我们将不触及用户示例,而是创建一个新的控制器和 bean 来执行过滤。

步骤 1: 在包 cn.javatiku.server.main.filtering 中创建一个名为 FilteringController.java 的控制器类。

步骤 2: 创建一个名为 SomeBean 的 bean。

FilteringController.java

package cn.javatiku.server.main.filtering;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
@RestController  
public class FilteringController   
{  
@RequestMapping("/filtering")  
public SomeBean retrieveSomeBean()  
{  
return new SomeBean("Amit", "9999999999","39000");  
}  
}  

步骤 3: 创建一个名为 SomeBean.java 的类。定义三个属性:namephonesalary

步骤 4: 生成构造函数。

步骤 5: 生成 Getter 和 Setter。

SomeBean.java

package cn.javatiku.server.main.filtering;  
import com.fasterxml.jackson.annotation.JsonIgnore;  
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;  
}  
}  

步骤 6: 打开 REST 客户端 Postman 并发送 GET 请求。它返回两个字段:name 和 phone。字段 salary 将不会包含在响应中。

restful-web-services-static-filtering.png

无论是将一个 SomeBean 作为响应发送,还是将一组 SomeBean 作为响应发送,字段 salary 都不会被发送到响应中。

步骤 7: 创建另一个返回 SomeBean 列表的 bean。

FilteringController.java

package cn.javatiku.server.main.filtering;  
import java.util.Arrays;  
import java.util.List;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
@RestController  
public class FilteringController   
{  
//returning a single bean as response  
@RequestMapping("/filtering")  
public SomeBean retrieveSomeBean()  
{  
return new SomeBean("Amit", "9999999999","39000");  
}  
//returning a list of SomeBeans as response  
@RequestMapping("/filtering-list")  
public List<SomeBean> retrieveListOfSomeBeans()  
{  
return Arrays.asList(new SomeBean("Saurabh", "8888888888","20000"), new SomeBean("Devesh", "1111111111","34000"));  
}  
}  

步骤 8: 再次使用 URI http://localhost/filtering-list 发送 GET 请求,返回 SomeBean 列表。

restful-web-services-static-filtering2.png

还有另一种方法可以使用注解 @JsonIgnoreProperties

@JsonIgnoreProperties

@JsonIgnoreProperties 是一个类级别的注解。它在 JSON 序列化和反序列化中忽略逻辑属性。

在下面的 SomeBean.java 文件中,我们指定了我们要在响应中忽略的属性 name 和 phone。这两个属性将参与 JSON 序列化和反序列化。

如果属性 salary 标有 @JsonIgnore,则在 JSON 序列化和反序列化中忽略所有属性。

换句话说,由 @JsonIgnore 和 @JsonIgnoreProperties 注解忽略的逻辑属性的并集将被认为在 JSON 序列化和反序列化中被忽略。

SomeBean.java

package cn.javatiku.server.main.filtering;  
import com.fasterxml.jackson.annotation.JsonIgnore;  
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;  
@JsonIgnoreProperties({"name", "phone"})  
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;  
}  
}  

当我们发送 GET 请求时,它返回一个空列表,因为属性 name 和 phone 在 @JsonIgnoreProperties 中指定,属性 salary 标有 @JsonIgnore。因此,它返回空列表。

restful-web-services-static-filtering3.png

现在删除注解 @JsonIgnore,再次发送 GET 请求。它只返回 salary 属性。

restful-web-services-static-filtering4.png

无论我们做了什么,都被称为静态过滤。假设我们想在一种情况下忽略名称,在另一种情况下忽略薪水,我们不能使用静态过滤来实现。为了实现此类过滤,我们使用动态过滤。

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术