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
karelss 已经回答了,你也可以在这里使用 javax.validation.constraints
包 maven 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());
}
}
我正在做一个项目,我需要在模型的字段上放置一些 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
karelss 已经回答了,你也可以在这里使用 javax.validation.constraints
包 maven 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());
}
}