带有Jersey的Spring Boot-过滤请求正文属性

时间:2019-05-28 10:51:01

标签: java spring spring-boot jersey

我想知道是否有某种方法可以过滤资源接收到的对象的属性。

让我自我解释:可以说我们有这个对象:

UserDTO

public final class IniciativaDocument {
    private String id;
    private String name;
    private String surname;
    private String address;
    private Double balance;
}

对于资源,我只需要属性“名称”和“姓”,而对于其他资源,我只需要“地址”和“ id”。有什么办法可以使像杰克逊这样的无用变量自动为空?

我的目标是,如果客户端发送的请求中包含不需要的字段,那么我不必在将其保存到数据库之前将其设置为null,因为注册时不应该初始化该字段。 / p>

谢谢。

编辑1

为了更加清楚:这是出于安全性和简便性的考虑。

想象一下我是一名黑客,并且以某种方式知道DTO类具有的字段。我可以轻松地向服务注册用户发送这样的POST请求:

{
   "id": "wrong",
   "name": "Wrong",
   "balance": 20000
}

对于我的服务,我只需要idname,但是黑客也发送了balance字段。

我想要做的是,当我收到该对象时,可以设置端点/api/v1/users(用于注册)以放置不是id或{{1 }}到name

您可能会说我可以确保它为0或手动将其设置为null。是的,是的,但是我想知道是否有一种自动且更舒适的方式来使用批注或类似内容。

编辑2

资源示例:

null

2 个答案:

答案 0 :(得分:0)

您可以使用Jackson's JsonIgnore Property,例如:

@JsonInclude(Include.NON_NULL)
public final class IniciativaDocument {
    private String id;
    private String name;
    private String surname;
    private String address;
}

因此,基本上它的作用是,将此类映射到Json时,它将忽略所有具有null值的字段。而且,如果您不希望将其应用于整个课程,则也可以在字段中进行。

并且如果您想通过front-end实现它,那么可以使用这个出色的API GraphQL,因此基本上在请求中,您将指定所需的字段,并且仅返回那些字段。

答案 1 :(得分:0)

使用匹配后过滤器: 您可以实现ContainerRequestFilter并用@PostMaching(javax.ws.rs.container.PreMatching)注释过滤器,并在那里处理其数据请求。

为您的过滤器定义一个@interface:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface AnnotationForYourFilter {}

使用@AnnotationForYourFilter注释所需的子资源,就完成了。