Подтвердите UUID Restful службы - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть служба RESTful, которая получает запрос POST со значениями UUID и записывает их в БД.Таким образом, проблема состоит в том, чтобы проверить, является ли UUID действительным или нет.Для этой цели я реализовал пользовательскую аннотацию:

@Constraint(validatedBy = {})
@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Pattern(regexp = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}")
public @interface validUuid {

    String message() default "{invalid.uuid}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Но по какой-то причине это не работает, даже если я передаю значение UUID, я постоянно получаю исключение:

javax.validation.UnexpectedTypeException: HV000030: не найден валидатор для ограничения «javax.validation.constraints.Pattern», проверяющий тип «java.util.UUID»

Есть ли варианты для проверки UUID правильно?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

вы можете использовать UUID.fromString(...);и поймать IllegalArgumentException

0 голосов
/ 20 декабря 2018

Вы не можете применить аннотацию @Pattern к чему-либо (java.util.UUID), которое не является CharSequence.Из аннотационной документации @Pattern (подчеркивает мою):

Принимает CharSequence .нулевые элементы считаются действительными.

Более того, насколько я понимаю, вы пытаетесь расширить поведение обработчика аннотаций валидации, передав его новому определению аннотации.

Если выЕсли вы хотите выполнить более сложную проверку, просто создайте свою аннотацию без других аннотаций проверки - их объединение не работает таким образом.Должно быть что-то , чтобы распознавать аннотации и проверять их.

@Target({ElementType.FIELD})
@Retention(RUNTIME)
public @interface ValidUuid {

    String message() default "{invalid.uuid}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Теперь создайте валидатор, который реализует ConstraintValidator<ValidUuid, UUID> и переопределите методы, выполняющие саму проверку.

public class UuidValidator implements ConstraintValidator<ValidUuid, UUID> {
    private final String regex = "....." // the regex

    @Override
    public void initialize(ValidUuid validUuid) { }

    @Override
    public boolean isValid(UUID uuid, ConstraintValidatorContext cxt) {
        return uuid.toString().matches(this.regex);
    }
}

и применить аннотацию:

@ValidUuid
private UUID uuId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...