我有一个简单的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;
}
}
}
答案 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) {
[...]
}