Я публикую код, который у меня сейчас есть:
Агрегированная выполняющаяся проверка:
Код: Выделить всё
public record User(
Id id,
Email email,
Password password
) {
public User {
try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
Validator validator = factory.getValidator();
Map validationErrorMessages = new HashMap();
String idViolations = validator.validate(id).stream().map(ConstraintViolation::getMessage).toList().toString();
if (!idViolations.equals("[]")) {
validationErrorMessages.put(id.toString(), idViolations);
}
String emailViolations = validator.validate(id).stream().map(ConstraintViolation::getMessage).toList().toString();
if (!emailViolations.equals("[]")) {
validationErrorMessages.put(email.toString(), emailViolations);
}
String passwordViolations = validator.validate(id).stream().map(ConstraintViolation::getMessage).toList().toString();
if (!passwordViolations.equals("[]")) {
validationErrorMessages.put(password.toString(), passwordViolations);
}
if (!validationErrorMessages.isEmpty()) {
throw new ValidationException(validationErrorMessages.toString());
}
}
}
}
Код: Выделить всё
public record Id(@NotNull Long value) {}
@GroupSequence({Email.class, Additional.class})
public record Email(
@NotNull
@Pattern(regexp = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$",
groups = Additional.class,
message = "Invalid e-mail format")
String value
) {
}
@GroupSequence({Password.class, Additional.class})
public record Password(
@NotNull
@Size(min = 12,
message = "must be at least {min} characters long")
@Pattern(regexp = ".*[a-z].*",
groups = Additional.class,
message = "must contain a small letter")
@Pattern(regexp = ".*[A-Z].*",
groups = Additional.class,
message = "must contain a capital letter")
@Pattern(regexp = ".*\\d.*",
groups = Additional.class,
message = "must contain a digit")
@Pattern(regexp = ".*[#?!].*",
groups = Additional.class,
message = "must contain one of special characters: [#, ?, !]")
String value
) {
}
Код: Выделить всё
@Aggregate
public record User(
Id id,
Email email,
Password password
) {}
Я читал что-то об процессорах аннотаций, плагине byte Buddy или видел что-то о перехватчиках конструкторов Java 21, но чем больше я читаю, тем меньше понимаю, какое решение соответствует моим потребностям.>
Подробнее здесь: https://stackoverflow.com/questions/792 ... ers-values
Мобильная версия