为RESTful服务实现静态过滤

本文概述

  • @JsonIgnore
  • @JsonIgnoreProperties
在本节中, 我们将学习如何过滤请求。
过滤器是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; @RestControllerpublic 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 {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; }}

步骤6:打开REST客户端Postman并发送GET请求。它返回两个字段:名称和电话。现场薪水将不随响应一起发送。
为RESTful服务实现静态过滤

文章图片
无论是发送一个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; @RestControllerpublic 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的列表。
为RESTful服务实现静态过滤

文章图片
还有另一种使用注释@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 {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; }}

当我们触发GET请求时, 它返回一个空列表, 因为属性名称和电话在@JsonIgnoreProperties中指定, 并且属性薪水用@JsonIgnore注释。因此, 它返回空列表。
为RESTful服务实现静态过滤

文章图片
现在, 删除注释@JsonIgnore并再次触发GET请求。它仅返回薪金属性。
为RESTful服务实现静态过滤

文章图片
【为RESTful服务实现静态过滤】我们所做的任何事情都称为静态过滤。假设我们要在一个场景中忽略名称, 而在另一场景中忽略薪水, 则无法使用静态过滤来做到这一点。为了实现这种类型的过滤, 我们使用动态过滤。

    推荐阅读