JAXB "noch seine super-Klasse bekannt ist in diesem Kontext" vermeiden @XmlSeeAlso
Erklärung & Workaround
Derzeit bin ich mit JAX-RS und Vermietung JAXB-bindings automatisch Griff Konvertierung der Daten in XML und JSON für mich in einer JEE6-Projekt. Alles funktioniert absolut fantastisch, bis ich versuchen, erstellen Sie eine Allgemeine response-Objekt zu wickeln alle meine Informationen.
Wenn ich versuchen, mit meinem generic-Antwort-Klasse com.eln00b.Wrapper
(enthält eine private Object result
Attribut) bekomme ich:
javax.xml.binden.MarshalException - mit linked exception: [com.Sonne.istack.SAXException2: class com.eln00b.CustomObject noch seine super-Klasse bekannt ist zu diesem Kontext. javax.xml.binden.JAXBException: class com.eln00b.CustomObject noch seine super-Klasse bekannt ist zu diesem Kontext.]
Also ich com.eln00b.Wrapper
:
@XmlSeeAlso ({com.eln00b.CustomObject})
public class Wrapper {
}
Alles funktioniert einwandfrei.
Das Problem
Möchte ich, dass dies extrem generisch. Ich will nicht t ständig zu Klassen hinzufügen, um die @XmlSeeAlso
annotation auf der com.eln00b.Wrapper
Klasse. Wie tun ich habe das system automatisch lokalisieren alle meine Klassen für die JAXB-Kontext?
Selbst wenn es einen hack wo ich so etwas wie Reflexionen um die Daten zu laden, ist das in Ordnung. Ich bin mir nur nicht sicher wie man den Kontext zum laden von Daten, ohne die @XmlSeeAlso
annotation. Mit der großen Menge von Anmerkungen, die ich erstellen werde, wird es einfach nicht funktionieren.
, Wie Es Manuell Gearbeitet
Funktionierte es nur manuell, indem die Daten wie dabei die manuelle Konvertierungen. Allerdings glaube ich nicht wollen, verwenden Sie die manuelle XML - /JSON-Erstellung, es sei denn, ich brauche unbedingt (ich will nicht zu viel mit content negotiation oder etwas in der Art).
Beispiel:
JAXBContext.newInstance(new Class[] {Wrapper.class, CustomObject.class});
Das wäre fein, aber wie sage ich der EE6-container, die
JAXBContext
zu verwenden? Ist es genauso einfach wie das erstellen einer @Provider
?Ich habe festgestellt, das in der JAX-RS-Dokumentation: "Allerdings, wenn die Standard-JAXBContext Klasse nicht geeignet ist, dann können Sie liefern eine JAXBContext Klasse für die Anwendung mit JAX-RS-provider interface ContextResolver." Ich würde Graben müssen, um in wehre wissen Sie wahrscheinlich mehr als ich, näher. Sorry.
Ich habe nicht gesehen, dass in der Dokumentation. Ich werde schauen es und sehen, was Los ist. Wenn ich es bekomme, zu arbeiten (oder wenn nicht) werde ich die Ergebnisse hier posten.
Abschnitt: "Mithilfe von JAX-RS Mit JAXB" docs.oracle.com/javaee/6/tutorial/doc/gkknj.html
InformationsquelleAutor el n00b | 2014-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, hier ist das, was das Wesen der benutzerdefinierte Konfliktlöser aussieht:
Nun, die Verarbeitung für "Last entsprechenden Kontext Daten" ist ziemlich einfach. Indem man im Grunde die Nachahmung
@XmlSeeAlso
mit Laufzeit-Daten:Nun, ich habe einige caching zu helfen, machen die Dinge effizienter für mich. Ich habe auch einen etwas komplexeren setup für meine root-Objekt, in dem es tatsächlich immer den überblick über die Klasse, die Daten auf Ihrem eigenen und es ziemlich schnell. Ich habe auch eine alternative, die markierten Klassen als "kontextuelle", die ich verwendet, Paket-Inspektion zu laden über Anmerkungen und automatisch hinzufügen, um den Kontext, aber ich habe nicht geprüft Effizienz auf, die noch. Ich habe einige Ideen für einen 3. Umsetzung, aber ich möchte mehr benchmarking abgeschlossen.
Das ist eigentlich genau das, was ich Tat. Die ersten laufen ich lass es einfach mehrfach aufgerufen werden und (zwar teuer) war nicht schrecklich. Wenn ich einen Last-test ist, wenn es sich bemerkbar macht. Danach wechselte ich die Handhabung und sicher es war nur einmal aufgerufen. Alles verhielt sich ungemein besser.
InformationsquelleAutor el n00b