У меня есть простой ресурс REST, который принимает пару параметров запроса.Я хотел бы проверить один из этих параметров, и наткнулся на ConstraintValidator
для этой цели.Ресурс REST ожидает, что параметр запроса territoryId
будет UUID
, поэтому я хотел бы проверить, действительно ли это UUID
.
Я создал аннотацию @IsValidUUID
,и соответствующий IsValidUUIDValidator
(который является ConstraintValidator
).С тем, что у меня сейчас, ничего не проверяется, и getSuggestions
принимает все, что я на него бросаю.Ясно, что я делаю что-то не так.
Что я делаю не так?
Ресурс REST теперь выглядит так:
@Component
@Path("/search")
public class SearchResource extends AbstractResource {
@GET
@Path("/suggestions")
@Produces(MediaType.APPLICATION_XML)
public Response getSuggestions(
@QueryParam("phrase") List<String> phrases,
@IsValidUUID @QueryParam("territoryId") String territoryId) {
[...]
}
}
IsValidUUID
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsValidUUIDValidator.class})
public @interface IsValidUUID {
String message() default "Invalid UUID";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
IsValidUUIDValidator
public class IsValidUUIDValidator implements ConstraintValidator<IsValidUUID, String> {
@Override
public void initialize(IsValidUUID constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
try {
UUID.fromString(value);
return true;
} catch (Exception e) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("The provided UUID is not valid")
.addConstraintViolation();
return false;
}
}
}