我有一个简单的REST资源,它接受几个查询参数。我想验证其中一个参数,并为此目的遇到了ConstraintValidator。REST资源期望查询param 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;
}
}
}发布于 2018-05-22 21:54:28
您需要使用以下注释在IsValidUUID上设置受支持的目标。
@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)或
@SupportedValidationTarget(ValidationTarget.PARAMETERS)编辑:
对不起,我不能让它直接在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) {
[...]
}https://stackoverflow.com/questions/50476290
复制相似问题