我正在編寫一個自定義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
這就是我得到的信息。沒有堆棧跟蹤甚至可以告訴我發生了什麼。
當我第一次看到這個時,我認爲我必須同時改變別的東西,否則會造成這種情況。然後,我評論了兩條新線,並重新測試,錯誤消失了。