【问题标题】:Java annotation for request fields请求字段的 Java 注释
【发布时间】: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


【解决方案1】:

您创建了接口,但没有创建该接口将使用的验证器类。 您的验证逻辑将进入验证器类的 isValid 方法。 你可以找到实现here

【讨论】:

  • 我已经在本教程中尝试过,但是在我发送数据时从不调用验证器类。这是因为UserUpdateRequest 扩展了实现Serializable BasicDataObject 吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-10-08
  • 2021-06-12
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2016-07-19
相关资源
最近更新 更多