我已经阅读了很多关于Java EE 6+附带的Bean Validation API的内容,并且我了解了验证api如何工作的基础知识,但在我阅读的文档中,所有示例都是单元测试这无法帮助我理解WHERE来实现验证操作。
我正在开发一个三层架构系统。我想将验证放在服务层,因此如果表示层不同(即Jax-RS,JSF等),我可以重用验证代码。但我对如何实施所述操作感到困惑。这是我被困的地方:
我有bean与模型中的不同实体交互。例如,这是我的bean中用于用户交互的方法 - >
public User getUser(
@Min(value = 0, message = "Must have a positive userId") int uid)
throws RetrievalNotFoundException {
try {
// I WANT TO VALIDATE UID HERE
// find User with provided uid
User foundUser = em.find(User.class, uid);
// IF the user is inactive
if (foundUser.getIsActive() == 0) {
// cannot find the content
throw new RetrievalNotFoundException();
}
// close the entity manager
em.close();
// return the user
return foundUser;
}
以下是hibernate文档中的示例:
Car object = new Car( "Morris" );
Method method = Car.class.getMethod( "drive", int.class );
Object[] parameterValues = { 80 };
Set<ConstraintViolation<Car>> violations = executableValidator.validateParameters(
object,
method,
parameterValues
);
assertEquals( 1, violations.size() );
Class<? extends Annotation> constraintType = violations.iterator()
.next()
.getConstraintDescriptor()
.getAnnotation()
.annotationType();
assertEquals( Max.class, constraintType );
我真的应该再次实例化bean以访问其方法getUser()吗?我很迷惑。我遇到的另一个问题是,如果某人决定为溢出int容器的uid放入一个int,会发生什么?我该如何验证?
非常感谢你的帮助, 我真的很感激。
答案 0 :(得分:4)
对您的问题提出一些意见。首先,Bean Validation确实是EE 6和EE 7的一部分。但是,EE 6仅包括Bean Validation 1.0,而EE 7包括Bean Validation 1.1。区别在于Bean Validation 1.0尚未包含方法验证,这就是您在示例中显示的内容。 Hibernate Validator从版本4开始包含一个Hibernate Validator特定方法验证API,但这不是标准的一部分,与Bean Validation 1.1和Hibernate Validator 5中指定的略有不同。
第二条评论是关于执行方法验证所需的代码。 Bean Validation仅提供进行方法级别验证的机制。这是您在示例中引用的API。在大多数情况下,您需要某种拦截技术来使用它。例如,Java EE 7使用CDI拦截器进行默认方法验证。这是标准的一部分。见http://beanvalidation.org/1.1/spec/#integration-cdi。如果您想使用EE 6,您需要使用您选择的技术编写自己的拦截逻辑。
关于你的最后一个问题。我认为通常不会检测到溢出。在这种情况下,Bean Validation无法做任何事情。