本文概述
在本节中, 我们将学习如何过滤请求。
过滤器是JAX-RS框架提供的重要功能之一。它用于各种环境。它可以应用于对资源的请求或来自资源的响应, 或两者都应用。
考虑一个我们不希望在响应中显示某些类成员的情况。此过程称为过滤。 Jackson具有两个用于过滤的注释:@JsonIgnore和@JsonIgnoreProperties。
@JsonIgnore
它是成员或方法级别的注释。它期望要排除的属性被一一标记。如果要从序列化和反序列化过程中删除成员, 则可以注释实际属性或其设置器或获取器。
让我们创建一个过滤器来过滤响应。我们将不涉及用户示例, 但是, 我们将创建一个新的控制器和bean来执行过滤, 而不是这个例子。
步骤1:在com.srcmini.server.main.filtering包中创建一个名称为FilteringController.java的Controller类。
步骤2:创建一个名为SomeBean的bean。
FilteringController.java
package com.srcmini.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的类。定义三个属性名称, 电话和薪水。
步骤4:生成构造函数。
步骤5:生成Getter和Setter。
SomeBean.java
package com.srcmini.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请求。它返回两个字段:名称和电话。现场薪水将不随响应一起发送。
无论是发送一个SomeBean作为响应, 还是发送SomeBeans列表作为响应, 字段工资都不会在响应中发送。
步骤7:创建另一个返回SomeBean列表的bean。
FilteringController.java
package com.srcmini.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请求, 该请求返回SomeBeans的列表。
还有另一种使用注释@JsonIgnoreProperties的方法。
@JsonIgnoreProperties
@JsonIgnoreProperties是类级别的注释。它忽略JSON序列化和反序列化中的逻辑属性。
在以下SomeBean.java文件中, 我们指定了属性名称和phone, 我们希望在响应中忽略它们。这两个属性将参与JSON序列化和反序列化。
如果使用@JsonIgnore注释属性薪金, 则在JSON序列化和反序列化中忽略所有属性。
换句话说, 在JSON序列化和反序列化中, 被@JsonIgnore和@JsonIgnoreProperties批注忽略的逻辑属性的并集被认为被忽略。
SomeBean.java
package com.srcmini.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请求时, 它返回一个空列表, 因为属性名称和电话在@JsonIgnoreProperties中指定, 并且属性薪水用@JsonIgnore注释。因此, 它返回空列表。
现在, 删除注释@JsonIgnore并再次触发GET请求。它仅返回薪金属性。
我们所做的任何事情都称为静态过滤。假设我们要在一个场景中忽略名称, 而在另一场景中忽略薪水, 则无法使用静态过滤来做到这一点。为了实现这种类型的过滤, 我们使用动态过滤。
评论前必须登录!
注册