openxava / 文档 / 第二十三章:注解中的属性

课程:1. 入门教学 | 2. 基本域模型(上) | 3. 基本域模型(下) | 4. 优化用户界面 | 5. 敏捷开发 | 6. 映射式超类继承 | 7. 实体继承 | 8. 视图继承(View) | 9. Java 属性 | 10. 计算属性 | 11. 用在集合的 @DefaultValueCalculator | 12. @Calculation 和集合总计 | 13. 从外部文件的 @DefaultValueCalculator | 14. 手动更改 schema | 15. 多用户时默认值的计算 | 16. 同步持久属性和计算属性 | 17. 从数据库中的逻辑 | 18. 使用 @EntityValidator 进行验证 | 19. 验证替代方案 | 20. 删除时验证 21. 自定义 Bean Validation 注解 | 22. 在验证中调用 REST 服务 | 23. 注解中的属性 | 24. 改进标准行为 | 25. 行为与业务逻辑 | 26. 参照与集合 | A. Architecture & philosophy | B. Java Persistence API | C. Annotations | D. Automated testing

目录

第二十三章:注解中的属性
在注解中添加属性
总结
在上一章,您学到如何调用 REST 服务来验证 ISBN。在本章,您将了解到如何在注解中添加属性。

在注解中添加属性

如果您需要重复使用一个验证,而且有时是跨多个项目,那么创建一个 Bean Validation 注解会是一个好方法。为了提高重用性,您需要在验证中使用参数。例如,对于您当前的项目,在 openlibrary.org 中搜索 ISBN 是可以的,但在另一个项目,甚至在您当前项目的另一个实体中,您不想调用这个特定的 URL。因此注解的代码必须更加灵活。
这种灵活性可以通过属性来实现。例如,我们可以在 ISBN 注解中添加一个 boolean 搜索属性,以便打开或关闭互联网搜索的验证。要实现此功能,只需将搜索属性添加到位于 com.yourcompany.invoicing.annotations 资料夹中的 ISBN 注解:
public @interface ISBN {
    boolean search() default true; // 启用或停用搜索
 
    // ...
}
这新的搜索属性可以从位于 com.yourcompany.invoicing.validators 资料夹中的验证器类中读取:
public class ISBNValidator implements ConstraintValidator<ISBN, Object> {
    // ...
    private boolean search; // 存储搜索选项
 
    public void initialize(ISBN isbn) { // 读取注解的属性值
        this.search = isbn.search();
    }
 
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (Is.empty(value)) return true;
        if (!validator.isValid(value.toString())) return false;
        return search ? isbnExists(value) : true; // 使用搜索
    }
    // ...
}
在这里您可以看到 initialize() 是如何使用的:在启用验证器前,先读取注解中属性的值。在这种情况下,我们只需将 isbn.search() 的值存储,好让 isValid() 可以使用。
现在您可以选择是否要调用 REST 服务来验证 ISBN:
public class Product{
//...

@ISBN(search=false) // 在这种情况下,不进行互联网搜索来验证(false) private String isbn;

//... }  
现在试试您的应用程序,您会注意到它会验证 ISBN 但并不会使用互联网搜索。

总结

恭喜!您已经学到如何在注解中添加属性。在最后这几章,您学到几种在 OpenXava 应用程序中进行验证的方法。现在您还学到如何使用自定义 Bean Validation 将可重用的验证逻辑封装在注解中。
验证在应用程序的逻辑中一个重要的部分,我们也鼓励您将其放入模型中,也就是在实体中。就像在最后这几章一样。不过,有时将逻辑放在模型类之外会是个好选择。您将在接下来的课程中学到。

下载本课源代码

对这节课有什么问题吗? 前往论譠 一切都顺利吗? 前往第二十四章