2017-07-14 74 views
0

我正在编写一个自定义Javadoc doclet来打印包含类的javax.validation约束表。它基本上可行,但我发现Doclet框架非常严格且不灵活。如何注册具有配置差异的自定义doclet的多个实例

对于背景,很可能某个类中的属性将具有多个验证约束。当我最初编写Taglet时,即使属性名称相同,我也为表中的每个约束提供了单独的行。

有人评论说他们希望可以选择为逗号分隔的同一行上的单个属性渲染所有约束。我个人并不认为我会这么想,但我没有理由限制这一点,因为这是一个合理的要求。

所以,我想,在一个Taglet上允许配置选项有多难?很难,因为我发现了。

首先,我认为可以定义带有配置选项的Taglet。然后我发现没有办法做到这一点。

好吧,那么我想我会使用一点点的诡计。

下面是一个代码块,从我Taglet的类:

public static void register(Map<String, Taglet> tagletMap) { 
    ValidationConstraintsTaglet taglet = new ValidationConstraintsTaglet(); 
    registerInstance(tagletMap, taglet, taglet.getName()); 
    //ValidationConstraintsTaglet tagletCombined = new ValidationConstraintsTaglet().combineConstraints(true); 
    //registerInstance(tagletMap, tagletCombined, taglet.getName() + "Combined"); 
} 

private static void registerInstance(Map<String, Taglet> tagletMap, Taglet taglet, String name) { 
    if (tagletMap.get(name) != null) { 
     tagletMap.remove(name); 
    } 
    tagletMap.put(name, taglet); 
} 

通过这样的代码,它工作完全正常,使每个约束一行。

如果我在注释掉的两行中注释掉了,这是尝试向另一个名称的第二个小标签实例注册,在名称的末尾添加“Combined”。在我的“toString(Tag)”方法中,我检查“isCombinedConstraints”选项,为一行上的单个属性渲染所有约束。如果默认情况下设置了“combinedConstraints”,我确信这个功能有效。

所以,如果我跑这跟评论这两条线中,我得到了一个令人困惑的错误:

javadoc: error - com.sun.tools.doclets.internal.toolkit.util.DocletAbortException: java.lang.ClassCastException: com.att.det.taglet.ValidationConstraintsTaglet cannot be cast to com.sun.tools.doclets.internal.toolkit.taglets.Taglet 

这就是我得到的信息。没有堆栈跟踪甚至可以告诉我发生了什么。

当我第一次看到这个时,我认为我必须同时改变别的东西,否则会造成这种情况。然后,我评论了两条新线,并重新测试,错误消失了。

回答

0

我放弃了这种方法,因为我无法得到它的工作,并没有在这里得到答复。

我不得不做的是在子类中实现配置更改,使用其自己的“注册”方法和不同的标签名称。