2017-07-14 5 views
0

Ich schreibe ein benutzerdefiniertes Javadoc-Doclet, um eine Tabelle mit javax.validation-Constraints für die enthaltene Klasse zu drucken. Es funktioniert grundsätzlich, aber ich finde das Doclet Framework ist ziemlich restriktiv und unflexibel.So registrieren Sie mehrere Instanzen von benutzerdefinierten Doclets mit Konfigurationsunterschieden

Im Hintergrund ist es sehr wahrscheinlich, dass eine Eigenschaft in einer Klasse mehr als eine Validierungsbedingung hat. Als ich das Taglet ursprünglich geschrieben habe, habe ich für jede Einschränkung separate Zeilen in der Tabelle gerendert, selbst wenn der Eigenschaftsname derselbe war.

Jemand hat kommentiert, dass sie die Option haben möchten, alle Einschränkungen für eine einzelne Eigenschaft in derselben Zeile, durch Kommas getrennt, darzustellen. Ich persönlich hätte nicht gedacht, dass ich das möchte, aber ich sah keinen Grund, dies zu beschränken, da es vernünftig ist, danach zu fragen.

Also, ich dachte, wie schwer könnte es sein, Konfigurationsoptionen für ein Taglet zu ermöglichen? Ziemlich schwer, wie ich herausgefunden habe.

Zuerst nahm ich an, dass es möglich wäre, Taglets zu definieren, die Konfigurationsoptionen annehmen. Ich habe dann entdeckt, dass es keine Möglichkeit gibt, das zu tun.

Ok, also dachte ich, ich würde ein bisschen Trickserei verwenden.

Hier ist ein Block von Code aus meiner taglet Klasse:

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); 
} 

Mit dem Code wie folgt funktioniert es völlig in Ordnung, pro Einschränkung eine Zeile zu machen.

Wenn ich in den beiden auskommentierten Zeilen kommentiert habe, wird versucht, eine SECOND-Instanz des Tags mit einem anderen Namen zu registrieren, indem am Ende des Namens "Combined" hinzugefügt wird. In meiner "toString (Tag)" - Methode überprüfe ich nach der "isCombinedConstraints" -Option, wobei alle Einschränkungen für eine einzelne Eigenschaft in einer einzelnen Zeile dargestellt werden. Ich habe sichergestellt, dass diese Funktionalität funktioniert, wenn "combinedConstraints" standardmäßig eingestellt ist.

Also, wenn ich das mit diesen beiden Linien kommentierten in laufen lasse, erhalte ich einen verwirrenden Fehler:

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 

Das ist alles, die Informationen, die ich erhalte. Kein Stacktrace, um mir zu sagen, wo das passiert.

Als ich das zum ersten Mal sah, nahm ich an, dass ich zur gleichen Zeit auch noch etwas anderes verändert haben musste, das das verursachen würde. Ich habe dann die zwei neuen Zeilen auskommentiert und erneut getestet, und der Fehler ist weg.

Antwort

0

Ich gab diesen Ansatz auf, da ich es nicht funktionierte und hier keine Antwort bekam.

Was ich gezwungen bin zu tun ist, Konfigurationsänderungen in einer Unterklasse mit seiner eigenen "Register" -Methode und einem anderen Tag-Namen zu implementieren.

Verwandte Themen