spring - 如何验证@QueryParam?
问题描述
我有一个简单的 REST 资源,它接受几个查询参数。我想验证其中一个参数,并ConstraintValidator
为此目的而遇到。REST 资源期望查询参数territoryId
是 a UUID
,所以我想验证它确实是一个有效的UUID
.
我创建了一个@IsValidUUID
注释和一个相应的IsValidUUIDValidator
(即 a 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;
}
}
}
解决方案
您需要使用以下注释在 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) {
[...]
}
推荐阅读
- c# - 单击第一个数据网格行不触发 selectedIndex 更改
- node.js - webpack-dev-server 不会在启动时创建初始包
- java - 在 java 8 流中将映射转换为更扁平的结构
- typescript - 带有 TypeScript 3.0 的 Visual Studio Code 1.25 变得非常慢
- javascript - 在深度优先遍历中理解 JavaScript 递归和调用栈
- multithreading - DynamoDB 的 updateitem 线程安全吗?
- ios - 是否有任何 iOS 操作扩展真的返回一个值?
- python - Python中从头开始的多元线性回归
- dynamics-crm - System.NullReferenceException:对象未设置为对象的实例?
- vue.js - 组件之间的 Vue 生命周期年表是什么?