Walidacja warunkowa za pomocą adnotacji

0

Prośba, mam taką walidację:

@Data 
public class Dane {
@NotBlank
private String pierwszeImie;
}

I teraz drugieImie ma nie być puste, tylko wtedy jak pierwsze imię = "Zenek". Jak zrobić najprościej taką walidację? Mega dzięki za wskazówki.

4

Maszyna powiedziała coś takiego:

Aby zrealizować taką walidację, można utworzyć własny walidator przy użyciu interfejsu ConstraintValidator. Najpierw, stworzymy adnotację @SecondNameNotBlankIfFirstNameIsZenek. Następnie, utworzymy klasę walidatora implementującą interfejs ConstraintValidator.

Oto kroki, które można wykonać:

Stworzyć adnotację:


import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = SecondNameNotBlankIfFirstNameIsZenekValidator.class)
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface SecondNameNotBlankIfFirstNameIsZenek {

    String message() default "Drugie imię musi być niepuste, jeśli pierwsze imię to Zenek";

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

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

}

Stworzyć klasę walidatora:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class SecondNameNotBlankIfFirstNameIsZenekValidator implements ConstraintValidator<SecondNameNotBlankIfFirstNameIsZenek, Dane> {

    @Override
    public void initialize(SecondNameNotBlankIfFirstNameIsZenek constraintAnnotation) {
    }

    @Override
    public boolean isValid(Dane dane, ConstraintValidatorContext context) {
        if (dane == null) {
            return true;
        }

        if ("Zenek".equals(dane.getPierwszeImie()) && (dane.getDrugieImie() == null || dane.getDrugieImie().trim().isEmpty())) {
            return false;
        }

        return true;
    }
}

Zastosować adnotację do klasy Dane:

import javax.validation.constraints.NotBlank;

@SecondNameNotBlankIfFirstNameIsZenek
public class Dane {

    @NotBlank
    private String pierwszeImie;

    private String drugieImie;

    // Gettery i settery

}

W ten sposób, walidacja drugiego imienia będzie wykonywana tylko wtedy, gdy pierwsze imię to "Zenek". Jeśli warunek nie jest spełniony, walidacja drugiego imienia nie zostanie uruchomiona.

--
wygląda sensownie, ale nie wiem - mnie więcej jak zaczęło na produkcję włazić się javax.validation to zrozumiałem, że czas się ewakuować z javy (tylko trochę mi to zajęło).

0

@jarekr000000: Strasznie Ci dziękuję. Niech Ci się wjedzie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1