تعليقات التحقق من صحة السبات المختلفة على نفس الممتلكات

StackOverflow https://stackoverflow.com/questions/3925736

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أستخدم اثنين من التعليقات التوضيحية للتحقق من صحة على خاصية في الفول:

@NotEmpty(message = "{name.required}")
@Pattern(regex = "^([A-Za-z0-9]{2,}(\\-[a-zA-Z0-9])?)$", message = "{invalid.name}")
private String name;

إذا تركت الاسم فارغًا ، فقد حصلت على خطأين ، لكنني أريد فقط رسالة الخطأ الأولى (في حالة حدوث الشرط الأول ، تظهر رسالة الخطأ الخاصة به ، ثم تخطي الشرط الثاني).

هل كانت مفيدة؟

المحلول

في حالة حدوث الشرط الأول ، يُظهر رسالة الخطأ الخاصة به ، ثم تخطي الشرط الثاني

يمكن القيام بذلك عن طريق إنشاء قيود مركبة وشرحه مع قيود meta Reportassingleviolation.

اسم المستخدم

@ReportAsSingleViolation
@NotEmpty
@Pattern(regexp="^([A-Za-z0-9]{2,}(\\-[a-zA-Z0-9])?)$")
@Constraint(validatedBy = {})
public @interface UserName {
    String message() default "invalid userName!";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

المرجعي 3.2. تكوين القيد

نصائح أخرى

الجواب المقبول لا يعمل كما تتوقع. تأكد من تكوين القيد جيد فقط إذا كنت ترغب في القائمة الكل الأخطاء في بأكمله سلسلة التكوين. لا يعمل إذا كنت تريد الخروج المبكر من أول خطأ في التحقق من الصحة.

المستندات ل @ReportAsSingleViolation قل يتم تجاهل تقارير الخطأ لكل قيد تأليف فرد.

باستخدام مثال قبول

@ReportAsSingleViolation
@NotEmpty
@Pattern(regexp="^([A-Za-z0-9]{2,}(\\-[a-zA-Z0-9])?)$")
@Constraint(validatedBy = {})
public @interface UserName {
    String message() default "invalid userName!";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

هذا يعني أنك ستحصل على خطأ في الرسالة الافتراضية لـ UserName التعليق التوضيحي وهو "اسم مستخدم غير صالح!" حتى لو فشل Notempty أولاً ....

يجب أن أقول إنني صدمت تمامًا من مدى سوء هذا التصميم من قبل منفذي التحقق من صحة Bean Java. ليس من المنطقي على الإطلاق أن تكون قد تم تأليف عمليات التحقق إذا قمت بإرجاع رسالة غير ذات صلة تمامًا. يجب أن يفشل أولاً وإرجاع الخطأ المقابل للتحقق من الصحة الذي فشل بالفعل!. على أي حال ، لا توجد طريقة للقيام بذلك دون اختراقات قبيحة هائلة. هذه مهمة التحقق من الصحة البسيطة تتحول إلى كابوس. 0_O

إن عملي حول الحل هو لا يؤلف عمليات التحقق ، فقط قم بإنشاء التحقق من صحة واحدة وتنفيذها بنفسك. إنه ليس جافًا ولكنه بسيط على الأقل.

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface Password {
    String message() default "{com.example.Password.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}



public class PasswordValidator implements ConstraintValidator<Password, String> {
    private Pattern twoDigitsPattern;

    public void initialize(Password constraint) {
        twoDigitsPattern = Pattern.compile("(.*[\\d]){2}");
    }

    public boolean isValid(String password, ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();

        if (password == null) {
            context.buildConstraintViolationWithTemplate("{javax.validation.constraints.NotNull.message}")
                    .addConstraintViolation();
            return false;
        }

        if (password.length() < 5 || password.length() > 10) {
            context.buildConstraintViolationWithTemplate("must be between 5 to 10 characters")
                    .addConstraintViolation();
            return false;
        }

        if (!twoDigitsPattern.matcher(password).matches()) {
            context.buildConstraintViolationWithTemplate("must contain 2 digits between [0-9]").addConstraintViolation();
            return false;
        }

        return true;
    }

}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top