我正在编写一个自定义的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的第二个实例,在名称的末尾添加“组合”。在我"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这就是我得到的所有信息。甚至没有堆栈跟踪来告诉我这是在哪里发生的。
当我第一次看到这一点时,我假设我一定也在同一时间改变了其他一些东西,从而导致了这一点。然后我注释掉了这两行代码并重新测试,错误就消失了。
发布于 2017-07-19 03:48:40
我放弃了这种方法,因为我不能让它工作,并且在这里没有得到响应。
我不得不做的是在一个子类中实现配置更改,它有自己的"register“方法和一个不同的标记名。
https://stackoverflow.com/questions/45109245
复制相似问题