gpt4 book ai didi

java - Hibernate validator ,带有验证组,用于具有写访问权限的序列化

转载 作者:行者123 更新时间:2023-12-01 09:22:07 25 4
gpt4 key购买 nike

我有一个端点,用户可以使用她的电子邮件/密码进行注册。但是我想检查密码是否不为空,但我也只想反序列化密码,因为我不想将其发送回客户端。

域名

public class User {
@NotEmpty
private String email;
@JsonProperty(access = Access.WRITE_ONLY)
@NotEmpty
private String password;

// Getters and setters
...
}

端点

@Path("/register")
@POST
public Response register(@Valid User user) {
...
}

我还尝试了 getter 上的 @JsonIgnore 和 setter 上的 @JsonProperty,而不是 Access.WRITE_ONLY

问题是 Hibernate Validator 不断提示密码为空,即使我 POST 设置了密码的用户也是如此:

"{"errors":["password may not be empty"]}"

我该如何解决这个问题?或者我是否必须在端点中实现自己的 NotEmpty 验证逻辑?

最佳答案

这可以使用验证组来完成。以下是实现这一目标的方法:

public class GroupValidationTest {


public static void main(String[] args) {
Validator v = Validators.newValidator();


Model m = new Model();
m.user = "Harry";
m.password = "Potter";

Set<ConstraintViolation<Model>> validate = v.validate(m, INPUT.class);
System.out.println(validate.size());

validate = v.validate(m, INPUT.class, OUTPUT.class);
System.out.println(validate.size());

validate = v.validate(m, OUTPUT.class);
System.out.println(validate.size());

m.password = null;

validate = v.validate(m, INPUT.class, OUTPUT.class);
System.out.println(validate.size());

validate = v.validate(m, OUTPUT.class);
System.out.println(validate.size());
}

public static class Model {

@NotEmpty(groups={INPUT.class, OUTPUT.class})
public String user;

@NotEmpty(groups={INPUT.class})
public String password;

}

public interface INPUT {}
public interface OUTPUT {}

}

输出:

0 -> Full object, validate INPUT 
0 -> Full object, validate INPUT + OUTPUT
0 -> Full object, validate OUTPUT
1 -> null password, validate INPUT + OUTPUT
0 -> null password, validate OUTPUT

说明:

Hibernate validator 框架支持验证约束组。它们用于告诉 validator 在特定验证尝试中要验证哪些组。您可以在这里阅读所有相关内容:

https://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#example-group-interfaces

我在代码示例中所做的是:

  • 定义 2 个组 INPUTOUTPUT
  • 标记要为两个组验证的用户属性
  • 将密码属性标记为仅在输入时验证

对于 REST 方面(不同的问题),输入和输出的验证通常由拦截器完成,通常是 MessageBodyReader 和 Writer 类。它们负责读取用户输入并将其写出。您可以在 Jersey 文档页面上阅读相关内容。

然后,您可以实现自己的验证读取器/编写器,它知道仅在读取用户输入时验证 INPUT ,而仅在写回序列化正文时验证 OUTPUT

希望对您有所帮助,

阿图尔

关于java - Hibernate validator ,带有验证组,用于具有写访问权限的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com