【发布时间】:2020-07-07 10:25:59
【问题描述】:
我有一个 API,我想使用自定义 @Annotation 验证一些 String 字段。验证应该在用户发送数据时进行。如果验证失败,我想抛出一个异常。验证会很复杂,因为我想检查 SQL 和 HTML 注入。
我得到了以下请求对象:
public class UserUpdateRequest extends BasicDataObject {
private static final long serialVersionUID = 1295104288600535600L;
// I would like to validate the firstName value upon receiving data
@CustomValidator
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
这是我的BasicDataObject :
@XmlRootElement
public abstract class BasicDataObject implements Serializable {
/**
* The generated serialVersionUID.
*/
private static final long serialVersionUID = 2876242398874879466L;
// some more stuff
}
我将如何实现这一目标?我知道我可以像这样创建自定义注释接口:
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface CustomValidator {
String value();
}
但我不知道将我的验证逻辑实际放在哪里,以便在我用@CustomValidator 注释的每个字段上调用它。我不使用弹簧。任何帮助表示赞赏!
编辑:
这是我使用javax 的网络适配器,我得到UserUpdateRequest:
@Path("/users")
@Produces("application/json")
@Consumes("application/json")
@GlobalSecurityResponse
public class UserAdapter {
@PUT
@JWTSecured(tokenType = UserTokenTypeEnum.AUTH, permissions = { UserEndpointPermissionsEnum.ACTIVE })
public Response updateUser(@Context SecurityContext securityContext, final UserUpdateRequest userUpdateRequest) {
Principal principal = securityContext.getUserPrincipal();
long userId = userBoundary.getPrincipalUserId(principal);
UserLoginResponse userLoginResponse = userBoundary.updateUser(userId, userUpdateRequest);
return Response.ok(userLoginResponse).build();
}
}
【问题讨论】:
-
使用反射 API 查找带注释的类,然后使用 API 将您的逻辑添加到 setter 方法中。
-
您可以添加一个预验证方法(在 Spring 中使用 AOP)拦截 API 请求,然后使用反射找到带注释的字段并验证它们。
-
我该怎么做?我将把我的网络适配器放在原来的问题中
标签: java validation annotations