【问题标题】:PMD find annotation and check if has attributePMD 查找注解并检查是否有属性
【发布时间】:2016-10-18 14:56:12
【问题描述】:

如何编写 PMD 规则来搜索 javax.validation.constraints.NotNull 注释并验证它是否具有消息属性?

不好:

@NotNull
private int value;

@NotNull(message = "value cannot be null.")
private int value;

我主要关心的是这个注释基本上可以放在任何地方

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

【问题讨论】:

    标签: java xpath pmd


    【解决方案1】:

    这里是查找 NotNull 注释的 xpath 查询,没有消息: //Annotation[*/Name/@Image = 'NotNull' and not(.//MemberValuePair/@Image = 'message')]

    我已经测试了除 ANNOTATION_TYPE 之外的所有情况,我不确定如何在 PMD 构建器应用中进行测试。

    如果你想要所有javax.validation.constraints,我想出了这个: //Annotation[*/Name/@Image = tokenize(replace(string-join(//ImportDeclaration/Name/@Image[starts-with(., "javax.validation.constraints.")], "|"), "javax.validation.constraints.", ""), '[|]') and not(.//MemberValuePair/@Image = 'message')]

    所以:获取以javax.validation.constraints. 开头的所有导入,使用string-join 转换为字符串,使用replace 删除javax.validation.constraints.,然后使用tokenize 拆分回一组值。

    【讨论】:

    • 太棒了!明天我会检查这个 xpath。如果我还没有要求太多,你能举个例子吗,我该如何修改这个 xpath,以便它会从 javax.validation.constraints 包中寻找其他注释,比如 @AssertTrue 或 @Min 如果它们也有 message 属性?
    • 暴力解决方案是or他们所有人://Annotation[./*/Name[@Image = 'NotNull' or @Image = 'AssertTrue' or ...] and not(.//MemberValuePair/@Image = 'message')],但使用all the annotations,这会有点烦人。 PMD 有它自己的 java 解析器,它不知道使用的注解是否来自javax.validation.constraints。也许对导入语句进行一些非常hacky的查询是可能的。
    • 我想出了一个非常疯狂的查询,它在 pmd 设计器中对我有用,并检查了 XPath 2.0,但请告诉我它是否也适用于规则集中。
    • 'tokenize' 的第二个选项没有成功。无论如何,不​​是这个包中的每个注释都有消息属性,所以这样更好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 2011-03-21
    • 2019-04-11
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多