Проверка значений параметров конструктора записиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проверка значений параметров конструктора записи

Сообщение Anonymous »

Я играю с современными версиями Java, такими как 17 или 21, вместе с проектом на основе Maven, и мне интересно, есть ли способ получить значения параметров конструктора и просто распечатать их или проверить их и в конечном итоге выдать исключение?
Я публикую код, который у меня сейчас есть:
Агрегированная выполняющаяся проверка:

Код: Выделить всё

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?) запись пользователя, либо выполнить внутреннюю проверку:

Код: Выделить всё

@Aggregate
public record User(
Id id,
Email email,
Password password
) {}
Или даже отказаться от аннотаций и проверять каждую запись, хранящуюся внутри определенного пакета, без дублирования кода или аннотаций.
Я читал что-то об процессорах аннотаций, плагине byte Buddy или видел что-то о перехватчиках конструкторов Java 21, но чем больше я читаю, тем меньше понимаю, какое решение соответствует моим потребностям.>

Подробнее здесь: https://stackoverflow.com/questions/792 ... ers-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»