如何验证@QueryParam?

时间:2018-05-22 20:52:24

标签: spring validation spring-4

我有一个简单的REST资源,它接受几个查询参数。我想验证其中一个参数,并为此目的遇到ConstraintValidator。 REST资源期望查询参数territoryIdUUID,因此我想验证它确实是有效的UUID

我创建了@IsValidUUID注释和相应的IsValidUUIDValidatorConstraintValidator)。凭借我现在拥有的东西,没有任何东西得到验证,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 :(得分:1)

您需要使用以下注释在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) {

        [...]

    }