Der Versuch, ein "Double" in " 12.34 ` mit JAXBJava

Java-Forum
Anonymous
 Der Versuch, ein "Double" in " 12.34 ` mit JAXB

Post by Anonymous »

Zuallererst bin ich ziemlich neu in Java, also ist das meiste, was ich versuche, wahrscheinlich falsch zu sein, und ich verstehe nicht viele Dinge, mit denen ich zu tun habe. Ich habe versucht, dieses genaue Problem für etwa 3 oder 4 Arbeitstage (in den letzten zwei Wochen verteilt) zu lösen und habe die Frustration für JAXB entwickelt. Java selbst und die meisten anderen Projekte scheinen mehr oder weniger in Ordnung zu sein, aber Jaxb scheint insbesondere nur zu existieren, um mich daran zu hindern, Arbeit zu erledigen. Dies war ein unordentlicher Weg zu meiner aktuellen Situation für dieses Problem (ich hatte auch Probleme mit anderen Dingen wie Wsimport , die ich lösen konnte), aber ich versuche, meine Versuche, dieses Partnerproblem zu lösen, auf mehr oder weniger einfache Weise beschreiben.

Code: Select all

org.springframework.boot:spring-boot-starter-web-services
com.sun.xml.ws:jaxws-rt:4.0.2
com.sun.xml.bind:jaxb-xjc:4.0.5
com.sun.xml.bind:jaxb-impl:4.0.5
org.jvnet.jaxb:jaxb-tools-project:4.0.11
wsdl4j:wsdl4j
< /code>
Wir haben ein Projekt, das sich mit einem Seifendienst mehrerer externer Endpunkte und Informationen von diesen Endpunkten herunterladen. Diese Software scheint zu funktionieren, aber [url=viewtopic.php?t=30561]ich möchte[/url] Integrationstests mit einer selbst geschriebenen Test-Server-Implementierung für dieses Projekt schreiben. Externe Partei (nicht die Webservice-Providers sich selbst, sondern einige Ebenen "über"). [url=viewtopic.php?t=30561]Ich möchte[/url] meinem Test-Server eine Seifenwebservice mit Spring-Webservices mit dieser WSDL schreiben. Ich habe Java-Klassen aus diesem WSDL (das extrahierte XSD-Schema) unter Verwendung von WSIMport 
erstellt und meine Spring @endpoint definiert.

Code: Select all

  ...

...
Dieser Wert Tag kann viele verschiedene Formen haben, von denen die meisten innerhalb des WSDL -Schemas nicht angegeben sind (ich bin nicht einmal sicher, ob sie mit XSD/WSDL angegeben werden können, aber vielleicht muss ich es versuchen, wenn alles andere fehlschlägt). Ich kann die WSDL -Datei nicht leicht ändern, da wir in Zukunft neue Versionen dieser Datei von dieser externen Partei erhalten werden. Das manuelle Ändern der generierten Klassen ist auch etwas, das ich vermeiden möchte, obwohl ich es getan habe, während ich nach einer Lösung für dieses Problem gesucht habe und Patch-Files im Build-Prozess verwendet. In meiner aktuellen Situation habe ich während des Builds eine PatchFile angewendet, die die generierte @xmlelement (name = "value") in @xmlanyElement (lax = true) für diese generierte Eigenschaft (das vom Typ -Objekt im generierten Java -Tadon -Maggus> -T -madda -mad> -Magnel -tags -tags -tags -madda -my -curo -mileston "mileston" -Ava -tägh. Double Objekt werden aus dem Titel: 12.34 in das Stück XML eingebunden, wobei der Namespace -Aliase korrekt der Namespace -Aliase entspricht, die JAXB später generiert, wenn sie die SOAP -Antwort marschiert. Ich muss in Zukunft viel flexibler sein, um alle Arten von Datentypen und Strukturen zu unterstützen, aber als erster Schritt doppelt reichen aus (es wäre zumindest ein paar Fortschritte). Dateien
Mein erster Versuch war es, eine externe Bindungsdatei zu definieren, um JAXB zu sagen

Code: Select all












mit statischen Mapping -Methoden wie Parsemethod und printMethod . Leider funktioniert dies nicht: < /p>

Code: Select all

parsing a schema...
[ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings.
line 22 of file:/home/user/git/foo/bar/src/main/resources/wsdl/binding.xjb

[ERROR] (the above customization is attached to the following location in the schema)
line 195 of file:/home/user/git/foo/bar/test-server/src/main/resources/wsdl/Schema.xsd

Failed to parse a schema.
< /code>
Ich bin mir nicht ganz sicher, warum diese Javatyp -Bindung an der falschen Stelle zu sein scheint, aber meine Arbeitstheorie ist, dass Bindungen wie diese
nur auf Typen angewendet werden können (auf Typen (simpleType< /code> /complexType < /code>) und nicht zu tags ohne type. jakarta.xml.bind.annotation.adapters.xmladapter.xmladapter  
), erhielt jedoch denselben Fehler:

Code: Select all

...
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
...

...
Und ich habe es auch ohne die und Tags und viele andere Variationen ohne Änderung der Fehlermeldung. Wie dieses: < /p>

Code: Select all

JAXBElement element = new JAXBElement(new QName(NAMESPACE, "Value"), Double.class, inputDouble);
element.setValue(inputDouble.toString());
return element;
... während Marshaller.SetsupportjaxBelementClass (true) auf den Marshaller. und
b) Der Unmarshaller im Client hat dies in eine Instanz von com.sun.org.apache.xerces.internal.dom.elementnSimpl (mit Typ = null ) gelöst, anstatt direkt in ein Doppel direkt. Wenn der Client mit einem "realen" externen Dienst verwendet wird, wird an diesem Ort ein Doppel direkt erstellt (von JAXB, möglicherweise aufgrund dieses fehlenden Typs Informationen?). Arbeit.

Code: Select all

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument()
Element element = doc.createElementNS(NAMESPACE, "Value");
element.setAttributeNS(XSI_NS, "type", "xsd:double");
element.setTextContent(input.toString());
return element;
Dies hat den offensichtlichen Nachteil, dass das XSD: Präfix hartcodiert ist. Sobald JASX ein anderes Präfix für diesen Namespace verwenden wird. Aber wenn es funktionieren würde, hätte ich zumindest eine Arbeitslösung. setAttributens und lasst den Jasx später den richtigen Namespace-Alias ​​ermitteln, aber leider unterstützt der DOM-API dies nicht.)

Quick Reply

12.34 ` mit JAXB" class="inputbox autowidth" />
12.34 ` mit JAXB" />
Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post