我想在 Jersey 中实现验证,这样如果我发送重复的 UserName 或 Email 值,而该值已经存在于数据库中,那么它应该抛出一个错误,指出 UserName/Email 已经存在。
我怎样才能做到这一点?
我浏览了这个 Jersey 文档
https://jersey.java.net/documentation/latest/bean-validation.html
https://github.com/jersey/jersey/tree/2.6/examples/bean-validation-webapp/src
但我不明白我必须遵循什么来进行自定义 Jersey 验证。
假设我在创建用户时在 Body 中发送了一个 Json,例如:
{
"name":"Krdd",
"userName":"khnfknf",
"password":"sfastet",
"email":"xyz@gmail.com",
"createdBy":"xyz",
"modifiedBy":"xyz",
"createdAt":"",
"modifiedAt":"",
}
在此先感谢您的帮助。
最佳答案
假设你有一个类的请求实例:
public class UserRequest {
// --> NOTICE THE ANNOTATION HERE <--
@UniqueEmail(message = "email already registered")
private final String email;
public UserRequest(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
您必须添加一个新注释(并使用@Constraint 将其链接到您的 validator 类):
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { UniqueEmailValidator.class })
@Documented
public @interface UniqueEmail {
String message();
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
然后你还必须自己实现验证:
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, UserRequest> {
@Override
public void initialize(UniqueEmail constraintAnnotation) {
}
@Override
public boolean isValid(UserRequest value, ConstraintValidatorContext context) {
// call to the DB and verify that value.getEmail() is unique
return false;
}
}
你就完成了。请记住,Jersey 在内部使用 HK2,因此如果您使用 Spring 或其他 DI,将某种 DAO 绑定(bind)到您的 validator 实例可能会很棘手。
关于java - 我如何在 Jersey 中使用自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304481/