【问题标题】:How do I use Custom Validations in Jersey如何在泽西岛使用自定义验证
【发布时间】:2015-11-25 02:07:41
【问题描述】:

我想在球衣中实现验证,这样如果我发送数据库中已经存在的用户名或电子邮件的重复值,那么它应该抛出一个错误,说用户名/电子邮件已经存在。

我怎样才能做到这一点?

我浏览了这个球衣文档

https://jersey.java.net/documentation/latest/bean-validation.html

https://github.com/jersey/jersey/tree/2.6/examples/bean-validation-webapp/src

但我不明白我必须遵循什么才能进行自定义泽西验证。

假设我在创建用户时在正文中发送了一个 Json,例如:

 {  
     "name":"Krdd",
     "userName":"khnfknf",
     "password":"sfastet",
     "email":"xyz@gmail.com",
     "createdBy":"xyz",
     "modifiedBy":"xyz",
     "createdAt":"",
     "modifiedAt":"",

  }

在此先感谢您的帮助。

【问题讨论】:

    标签: java spring validation rest jersey


    【解决方案1】:

    假设你有一个类的请求实例:

    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 将其链接到您的验证器类):

    @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 绑定到您的 Validator 实例可能会很棘手。

    【讨论】:

    • 这是一个很好的答案,但我收到了这个错误:javax.validation.UnexpectedTypeException: HV000030: No validator can be found for constraint 'com.project.forms.validator.UniqueEmail' 验证类型 'java .lang.String'。检查 'edit.arg1.email' 的配置。这可能意味着自定义注释不适用于 String .. 有什么可以使它与 Strings 一起使用吗?我正在使用 jdk8
    • 现在和我一起工作,当我在 UniqueEmailValidator 类中将 UserRequest 更改为 String .. 不知道它是否是 jdk8 的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多