Java 不使用 Hibernate 的 Bean 验证的替代注解

Alternative Annotations to Java Bean Validation Without Using Hibernate

我正在做一个项目,我需要在模型的字段上放置一些 limitations/constrains(例如 "String name" 字段不应超过 10 个字符)。对于这项工作,我只能找到 Java Bean Validation API。然而,正如我所见,它与 Hibernate 和 Spring 框架一起使用。

遗憾的是,项目中并没有使用Hibernate这样的ORM。我们正在使用 DAO 模式和 JDBI 进行数据库操作。

在 Java 上是否有任何替代注释有助于像 Bean Validation 那样对字段施加约束(并希望像 Lombok 那样使用魔法)?我基本上需要 Size、Min/Max 和 NonNull 注释。

基本上是这样的:

class User {

  @Size(max = 10)
  String name;
}

Java Bean Validation API 是这项工作的正确工具,但正如你所说的是 api,如果你使用的是应用程序服务器,你将有不同的实现你可以使用任何你想要的,它没有链接到休眠或 spring,你看到的是 api 实现的不同提供者。此 api 适用于对象,您可以用它注释任何对象。

如果您不想包含依赖项,您可以使用您自己的注释以兼容的方式实现此验证,例如 here

Java 7 Bean validation API

karelss 已经回答了,你也可以在这里使用 javax.validation.constraintsmaven link。这是可能的实现和测试代码(不完美)。

User.java

  import javax.validation.constraints.Size;

        class User {

            @Size(max = 10)
            String name;

            public String getName() {
            return name;
            }

            public void setName(String name) {
            this.name = name;
            }

        }

UserTest.java

import static org.junit.Assert.assertEquals;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.junit.Test;

public class UserTest {

    @Test
    public void test() {
    User user = new User();
    // set name over 10
    user.setName("12345678912");

    // validate the input
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<User>> violations = validator.validate(user);
    for (ConstraintViolation v : violations) {
        String key = "";
        if (v.getPropertyPath() != null) {
        key = v.getPropertyPath().toString();
        assertEquals("name", key);
        assertEquals("size must be between 0 and 10", v.getMessage());
        }

    }
    assertEquals(1, violations.size());
    }

}