Spring 如何验证@QueryParam?

Spring 如何验证@QueryParam?,spring,validation,spring-4,Spring,Validation,Spring 4,我有一个简单的REST资源,它接受两个查询参数。我想验证其中一个参数,为此遇到了ConstraintValidator。REST资源希望查询参数territoryId是一个UUID,因此我想验证它是否确实是一个有效的UUID 我已经创建了一个@isvaliduid注释和一个相应的isvaliduidvalidator(它是一个约束验证器)。就我现在所拥有的,没有任何东西得到验证,getSuggestions接受我对它抛出的任何东西。很明显我做错了什么 我做错了什么 REST资源现在如下所示: @

我有一个简单的REST资源,它接受两个查询参数。我想验证其中一个参数,为此遇到了
ConstraintValidator
。REST资源希望查询参数
territoryId
是一个
UUID
,因此我想验证它是否确实是一个有效的
UUID

我已经创建了一个
@isvaliduid
注释和一个相应的
isvaliduidvalidator
(它是一个
约束验证器
)。就我现在所拥有的,没有任何东西得到验证,
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) {

        [...]

    }
}
@组件
@路径(“/search”)
公共类SearchResource扩展了AbstractResource{
@得到
@路径(“/建议”)
@生成(MediaType.APPLICATION\u XML)
公众回应及建议(
@QueryParam(“短语”)列出短语,
@IsValidUID@QueryParam(“territoryId”)字符串territoryId){
[...]
}
}
isvaliduid

@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 {};

}
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@保留(RetentionPolicy.RUNTIME)
@记录
@约束(validatedBy={IsValidUUIDValidator.class})
public@interface isvaliduid{
字符串消息()默认为“无效UUID”;
类[]组()默认值{};

类您需要使用以下注释在isvaliduid上设置支持的目标

@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)

编辑:

很抱歉,我无法使它直接在RequestParam上工作。但是,如果可以,请尝试创建一个POJO,您可以将请求参数绑定到该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) {

        [...]

    }
公共类MyModel{
@Isvaliduid
私有字符串territoryId;
公共字符串getTerritoryId(){
返回territoryId;
}
公共无效设置域ID(字符串域ID){
this.territoryId=territoryId;
}
}
@得到
@路径(“/建议”)
@生成(MediaType.APPLICATION\u XML)
公众回应及建议(
@QueryParam(“短语”)列出短语,
@有效@modeldattribute MyModel MyModel){
[...]
}

谢谢,即使没有@SupportedValidationTarget,它似乎也能工作,但我感到困惑,因为资源没有输出自定义错误消息。它只输出通用的“错误请求”JSON。@sbrattla请检查编辑;我无法将代码粘贴到注释中。
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
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) {

        [...]

    }