我正在编写一个自定义Javadoc doclet来打印包含类的javax.validation约束表。它基本上有效,但我发现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);
}
使用这样的代码,它完全正常,每个约束渲染一行。
如果我在注释掉的两行中注释,这是尝试使用不同的名称注册taglet的第二个实例,添加&#34; Combined&#34;到名字的末尾。在我的#34; toString(标签)&#34;方法,我检查&#34; isCombinedConstraints&#34;选项,在单行上呈现单个属性的所有约束。我确保这个功能有效,如果&#34; combinedConstraints&#34;默认设置。
所以,如果我用这两行评论来运行它,我会遇到一个令人困惑的错误:
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 :(得分:0)
我放弃了这种方法,因为我无法正常工作而且没有得到任何回应。
我不得不做的是在子类中实现配置更改,使用自己的“register”方法和不同的标记名称。