Как зарегистрировать несколько экземпляров пользовательских доклетов с различиями в конфигурации
Я пишу пользовательский доклет Javadoc для печати таблицы ограничений javax.validation для содержащего класса. Это в основном работает, но я считаю, что структура Doclet довольно ограничена и негибка.
Для фона очень возможно, что свойство в классе будет иметь более одного ограничения проверки. Когда я изначально писал 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);
}
С таким кодом он прекрасно работает, отображая одну строку на ограничение.
Если я прокомментировал две закомментированные строки, это попытка зарегистрировать ВТОРОЙ экземпляр тега с другим именем, добавив "Комбинированный" в конец имени. В моем методе "toString(Tag)" я проверяю эту опцию "isCombinedConstraints", отображая все ограничения для одного свойства в одной строке. Я удостоверился, что эта функциональность работает, если по умолчанию установлен "mixedConstraints".
Итак, если я запустил это с этими двумя прокомментированными строками, я получу недоумение:
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
Это вся информация, которую я получаю. Нет стека трассировки, чтобы даже сказать мне, где это происходит.
Когда я впервые увидел это, я предположил, что я, должно быть, также изменил что-то еще в то же время, что могло бы вызвать это. Затем я закомментировал две новые строки и перепроверил, и ошибка исчезла.
1 ответ
Я отказался от этого подхода, так как не мог заставить его работать и не получил ответа.
То, что я вынужден сделать, это реализовать изменения конфигурации в подклассе, с собственным методом "register" и другим именем тега.