将动态参数传递给注释

2023-12-01

我想知道是否有可能将动态值传递给注释属性。

我知道注释不是为了修改而设计的,但我正在使用休眠过滤器在我的情况下,要放置的条件不是静态的。

我认为唯一的解决方案是使用旨在读取和修改字节码的库,例如 Javassist 或ASM但如果有其他解决方案那就更好了。

ps:我的情况的困难是我应该修改注释(属性的值),但是我上面提到的库允许创建而不是编辑,这就是为什么我想知道另一个解决方案

提前致谢


我不知道它是否与您的框架很好地集成,但我想建议以下内容:

  • 创建一个注释,该注释接收实现验证规则的类
  • 创建一个注解可以接收的接口
  • 为具有规则逻辑的接口创建一个实现
  • 将注释添加到您的模型类中
  • 创建一个注释处理器,对每个注释字段应用验证

我用 Groovy 编写了以下示例,但使用了标准 Java 库和惯用的 Java。如果有任何内容不可读,请警告我:

import java.lang.annotation.*

// Our Rule interface
interface Rule<T> { boolean isValid(T t) }

// Here is the annotation which can receive a Rule class
@Retention(RetentionPolicy.RUNTIME)
@interface Validation { Class<? extends Rule> value() }

// An implementation of our Rule, in this case, for a Person's name
class NameRule implements Rule<Person> {
  PersonDAO dao = new PersonDAO()
  boolean isValid(Person person) {
    Integer mode = dao.getNameValidationMode()
    if (mode == 1) { // Don't hardcode numbers; use enums
      return person.name ==~ "[A-Z]{1}[a-z ]{2,25}" // regex matching
    } else if (mode == 2) {
      return person.name ==~ "[a-zA-Z]{1,25}"
    }
  }
}

在这些声明之后,用法:

// Our model with an annotated field
class Person {
  @Validation(NameRule.class)
  String name
}

// Here we are mocking a database select to get the rule save in the database
// Don't use hardcoded numbers, stick to a enum or anything else
class PersonDAO { Integer getNameValidationMode() { return 1 } }

注解的处理:

// Here we get each annotation and process it against the object
class AnnotationProcessor {
  String validate(Person person) {
    def annotatedFields = person.class.declaredFields.findAll { it.annotations.size() > 0 }
    for (field in annotatedFields) {
      for (annotation in field.annotations) {
        Rule rule = annotation.value().newInstance()
        if (! rule.isValid(person)) {
          return "Error: name is not valid"
        }
        else {
          return "Valid"
        }
      }
    }
  }
}

和测试:

// These two must pass
assert new AnnotationProcessor().validate( 
  new Person(name: "spongebob squarepants") ) == "Error: name is not valid"

assert new AnnotationProcessor().validate( 
  new Person(name: "John doe") ) == "Valid"

另外,看看G合同,它提供了一些有趣的通过注释进行验证的模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将动态参数传递给注释 的相关文章

随机推荐

  • 如何用CSS将图像放入div中?

    我希望将所有图像都放在 CSS 中 我知道的唯一方法是将它们作为背景图像放入 但这个解决方案的问题是你永远不能让 div 占据图像的大小 所以我的问题是 最好的方法是什么 div img src div in CSS 这个答案由Jaap d
  • R 中的等值线地图 - TIGER Shapefile 问题

    有一个关于使用 R 进行绘图的问题 特别是有关 R 中的分区统计图的问题 我有一个分配给某个区域的邮政编码数据集和一些相关数据 数据集是here 我的最终数据格式是 区域 ID 邮政编码 概率值 客户计数 区域概率和区域客户总数 我试图通过
  • CakePHP HABTM 表单提交

    我有两张桌子 questions and tags 具有 HABTM 关系 添加问题时 我希望能够为问题指定一个标签 这只是第一个标签 以后可以添加更多标签 标签是从他们的桌子上拉出来的 如何配置我的应用程序 以便在添加问题并指定标签时 连
  • Django 模型中的任意类型数据

    我有一个模型 比如说 Item 我想在其上存储任意数量的属性 例如标题 描述 发布日期 我希望它们不仅仅是字符串 还有 python 类型 所以字符串 布尔值 日期时间等 我在这里有什么选择 由于所有值的数据库类型相同 因此具有单独的名称
  • 对 MERN Stack 等 Web 和 API 解决方案进行身份验证和授权的最佳方式是什么?

    我正在尝试找到实施授权的最佳方法 此时 我唯一需要的是一个简单的免费帐户 但稍后我可能会包含使用 Stripe 等支付系统的 高级 帐户的用户角色 我已经开始阅读和尝试 Auth0 但后来发现了一些其他方法可以做到这一点 Passport
  • Word 非数字中的 rmarkdown 方程是 q‌u‌e‌s‌t‌i‌on 标记

    在 RStudio 中 rmarkdown 方程符号未在 Word 中重现 当我点击Knit Word时 A pi r 2 在Word文档中变成这样 2 html pdf都没有问题 None
  • 如何影响 Shopware 6.4.13.0 中的模板加载顺序

    这与Shopware 6 插件按什么顺序加载 当覆盖不同插件中的模板时 加载顺序很重要并且取决于插件安装日期 我相信在最近的 Shopware 版本中可以以更好的方式解决这个问题 这是如何运作的 您可以从上一个版本开始添加getTempla
  • php 会话在 Android 应用程序中被破坏

    我正在android中构建一个登录应用程序 其中我点击一个url 带有用户名和密码 直到该部分它工作正常 但之后每当我点击一个url 一旦用户通过身份验证 它什么都不返回 即错误消息 例如请先登录 然而 它在非常相似的 iPhone 应用程
  • 更新面板中的按钮正在执行完整的回发?

    我正在遵循一个如何使用此处的更新面板的简单示例 http www asp net Ajax Documentation Live tutorials IntroductionUpdatePanel aspx 在更新面板之外 我有另一个 ht
  • 在 R 中动态子集调查设计对象

    我试图弄清楚如何动态地对调查设计对象进行子集化 我已经构建了循环来发送字符串 但不知道如何删除引号 因此 R 将其读取为调用 我想循环遍历这样的一些 尽管这显然会中断 因为 SUBSET VARIABLE in 4 需要是一个调用而不是一个
  • Java字节码与不同版本的Java兼容吗?

    如果我使用 Java 5 代码将应用程序编译为字节码 生成的 class 文件能够在 Java 1 4 下运行吗 如果后者可以工作并且我正在尝试在我的 Java 1 4 应用程序中使用 Java 5 框架 是否有有什么我应该注意的吗 Nop
  • JSP形式的空字段是null还是“”?

    当表单传递到 servlet 时 是空字段 还是 null 例如 在一个表单中 您将名字作为字段 将姓氏作为字段院长 名字 姓那么它在 servlet 中注册为什么呢 提前致谢 Dean 简单 如果参数名称存在 但值不存在 则它为空 如果参
  • Billingservice Android - 无签名

    我遵循了以下很棒的教程 http blog blundell apps com simple inapp billing payment 我已经完成了教程中所说的所有内容 并且已将所有内容重新阅读了 3 遍 但我仍然没有收到签名intent
  • 如何构建 SQL 查询来查找作为两个特定其他对象的父对象的对象?

    假设我有 2 个表 分别称为父表和子表 一个父母可以有 0 到多个孩子 一个孩子可以有 1 到多个父母 如何找到作为两个特定子元素的父元素的所有父元素 例如 假设我有父母 p a p b p c p d 和孩子 c a c b 它们的结构如
  • 连续训练多个序列模型会减慢速度

    我正在使用 Keras TensorFlow GPU 创建时间序列预测模型 我有 100 倍的时间序列 想为每个时间序列训练一个网络 连续运行几个时间序列很好 但一旦我运行 100 倍或 1000 倍 每个模型的训练时间就会缓慢增加 但肯定
  • 如何在java中设置jasper报表的边距?

    如何在java中设置jasper报表的边距 我有 reports jasper 带边距 但是打印时我必须更改边距 JasperPrint setTopMargins myMarginsValue 不起作用 I use JRPrintServ
  • 将字符串转换为元组并添加到元组

    我有一个这样的配置文件 rects rect1 2 2 10 10 rect2 12 8 2 10 我需要循环遍历这些值并将它们转换为元组 然后我需要制作一个元组的元组 例如 2 2 10 10 12 8 2 10 除了使用正则表达式或 i
  • 使用键盘快捷键触发 Silverlight Prism 命令

    有谁知道是否可以通过快捷方式触发 prism 命令 我的意思是我希望能够以声明方式定义命令与键盘快捷键的绑定 例如ClientUI does 有没有用于此目的的开源库 或者也许是代码示例 I found 这个问题但我不认为它回答了我的问题
  • 获取通用 List 中 T 的实际类型

    如何在运行时使用反射获取通用列表中 T 的实际类型 这取决于您到底要问什么 在泛型类型中编写代码时Blah
  • 将动态参数传递给注释

    我想知道是否有可能将动态值传递给注释属性 我知道注释不是为了修改而设计的 但我正在使用休眠过滤器在我的情况下 要放置的条件不是静态的 我认为唯一的解决方案是使用旨在读取和修改字节码的库 例如 Javassist 或ASM但如果有其他解决方案