Как я могу проверить @QueryParam? - PullRequest
0 голосов
/ 22 мая 2018

У меня есть простой ресурс 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;
        }

    }

}

1 Ответ

0 голосов
/ 23 мая 2018

Вам необходимо установить поддерживаемые цели для IsValidUUID, используя следующую аннотацию.

@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)

или

@SupportedValidationTarget(ValidationTarget.PARAMETERS)

Редактировать:

Извините, я не смог заставить его работать на RequestParam напрямую.Однако, если вы можете, попробуйте создать POJO, к которому вы можете привязать параметры вашего запроса, и вместо этого аннотируйте поле привязки вашим ограничением.Это сработало для меня.

public class MyModel {

    @IsValidUUID
    private String territoryId;

    public String getTerritoryId() {
        return territoryId;
    }
    public void setTerritoryId(String territoryId) {
        this.territoryId = territoryId;
    }

}

@GET
    @Path("/suggestions")
    @Produces(MediaType.APPLICATION_XML)
    public Response getSuggestions(
            @QueryParam("phrase") List<String> phrases, 
            @Valid @ModelAttribute MyModel myModel) {

        [...]

    }
...