1

我定义了一个注释:

public @interface AdminMapping {
    public final static int USER = 100;
    public final static int COMPANY = 10;
    public final static int ADMIN = 0;

    int adminLevel() default AdminMapping.USER;
    String displayName();
    String category() default "";
    String hasPermission() default "";
    String parentCategory() default "";
}

我想这样做,除非你有一个类别,否则你不能有一个 parentCategory....

    @AdminMapping(category="Company", displayName="FOO", adminLevel=AdminMapping.USER)
public static final String MONKEY = "chimp";


    @AdminMapping(parentCategory="Company", displayName="BAR", adminLevel=AdminMapping.USER) //NOT VALID Parent without Category
public static final String HORSE = "zebra";

虽然我在它,但如果我能做到这一点,我也会喜欢它,所以类别不等于 parentCategory。

我知道如何使用 ConstraintValidator 来验证 MONKEY 和 HORSE,但我想验证实际的 AdminMapping 条目。这可以在编译时完成吗?

任何帮助表示赞赏。

4

2 回答 2

1

您需要获取对注释的引用并检查其属性

AdminMapping mapping = ...; // depends on what your annotation is annotating

if (mapping.category().isEmpty()) {
    if (!mapping.parentCategory().isEmpty()) {
        // we got a beef
    }
}
于 2013-10-08T16:17:09.267 回答
1

使用PMD。PMD 是一种工具,可以解析您的源代码并让您检查它是否符合某些规则。它带有许多内置规则,但您可以编写自己的规则,这样您就可以编写规则来检查您的注释是否定义为您想要的。

有关编写自己的规则的说明,请参阅此页面。

例如,很容易编写一个规则来检查一个注解是否同时定义了 parentCategory 和 category。

首先在一个规则 xml 文件中声明自定义规则:

<?xml version="1.0"?>
<ruleset name="My custom rules"
     xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule name="NoParent"
      message="No parent category without category"
      class="com.test.CategoryRule">
    <description>
        No parent category without category
    </description>

</rule>

然后定义一个将执行实际执行的 Java 类。

public class CategoryRule extends AbstractJavaRule {
public Object visit(ASTMemberValuePairs node, Object data) {

    boolean hasCategory = false;
    boolean hasParentCategory = false;

    for ( int i = 0; i < node.jjtGetNumChildren(); ++i ) {
        if ( node.jjtGetChild(i).getImage().equals("category") ) {
            hasCategory = true;
        } else if ( node.jjtGetChild(i).getImage().equals("parentCategory") ) {
            hasParentCategory = true;
        }
    }

    if ( hasCategory && !hasParentCategory ) {
        addViolation(data, node);
    }

    return data;
}

}

显然,您需要编写代码以使其在现实中更加健壮,检查注释类型,但希望足以让您开始。

于 2013-10-12T10:07:46.157 回答