SpringBoot教程-实现 RESTful 服务的静态过滤
实现 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 的类。定义三个属性:name、phone 和 salary。
步骤 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 将不会包含在响应中。
无论是将一个 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 列表。
还有另一种方法可以使用注解 @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。因此,它返回空列表。
现在删除注解 @JsonIgnore,再次发送 GET 请求。它只返回 salary 属性。
无论我们做了什么,都被称为静态过滤。假设我们想在一种情况下忽略名称,在另一种情况下忽略薪水,我们不能使用静态过滤来实现。为了实现此类过滤,我们使用动态过滤。