📜  为RESTful服务实现静态过滤

📅  最后修改于: 2021-01-11 06:02:09             🧑  作者: Mango

为RESTful服务实现静态过滤

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

过滤器是JAX-RS框架提供的重要功能之一。它用于各种环境。它可以应用于对资源的请求或来自资源的响应,或两者都适用。

考虑一个我们不希望在响应中显示某些类成员的场景。此过程称为过滤。 Jackson过滤中使用了两个注释: @JsonIgnore@JsonIgnoreProperties

@JsonIgnore

它是成员或方法级别的注释。它期望要排除的属性被一一标记。如果要从序列化和反序列化过程中删除成员,则可以注释实际属性或其设置器或获取器。

让我们创建一个过滤器来过滤响应。我们不会碰用户示例,但是,我们将创建一个新的控制器和bean来执行过滤,而不是这个例子。

步骤1:在包com.javatpoint.server.main.filtering中创建一个名称为FilteringController.java的Controller类。

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

FilteringController.java

package com.javatpoint.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.javatpoint.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.javatpoint.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 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.javatpoint.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请求。它仅返回薪金属性。

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