Ich versuche, eine REST WebService zu konsumieren, in der die Anfragen als serialisierte XML gesendet werden ObjekteRangieren mit complextype name statt JAXB Klassenname Anmerkung
Hier ist ein Beispiel
https://localhost:9985/fr_FR/api.ReceiveXMLmessage?xmlString=<TDetails_XCC OpeType="SOME_OPERATION"><TeamID>SOME_ID</TeamID></TDetails_XCC>
Daraus ich habe das folgende XSD-Schema
<complexType name="TDetails_XCC">
<annotation>
<appinfo>
<jaxb:class name="TeamDetailsRequestType"/>
</appinfo>
<documentation>Request team details</documentation>
</annotation>
<complexContent>
<extension base="local:SimpleRESTRequestType"/>
</complexContent>
</complexType>
<complexType name="SimpleRESTRequestType">
<sequence>
<element name="TeamID" minOccurs="0" type="long">
<annotation>
<appinfo>
<jaxb:property name="teamId"/>
</appinfo>
</annotation>
</element>
</sequence>
<attribute name="OpeType" type="string" default="some_operation">
<annotation>
<appinfo>
<jaxb:property name="operationType"/>
</appinfo>
</annotation>
</attribute>
</complexType>
Dies ist die erzeugte Java Bean
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TDetails_XCC")
@XmlRootElement public class TeamDetailsRequestType
extends SimpleRESTRequestType
implements Serializable
{
}
Dies ist der Code verwendet, um die Bohnen zu XML serialisiert
TeamDetailsRequestType request = new TeamDetailsRequestType();
request.setTeamId(546464L);
request.setOperationType("SomeOperation");
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance("com.mycompany.myproject.message.team");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
marshaller.marshal(request, writer);
System.out.println(writer.toString());
Dies ist, was die vermarshallten Bohne
<teamDetailsRequestType OpeType="SomeOperation">
<TeamID>546464</TeamID>
</teamDetailsRequestType>
wie
aussieht Und das, was ich mich wünschte bekam<TDetails_XCC OpeType="SomeOperation">
<TeamID>546464</TeamID>
</TDetails_XCC>
Ich habe es geschafft, es mit der QName-Klasse
arbeiten zu bekommenJAXBElement jx = new JAXBElement(new QName("TDetails_XCC"), request.getClass(), request);
marshaller.marshal(jx, System.out);
Aber was ich gerne wissen würde ist, wenn es möglich ist, dies ausschließlich aus dem XSD-Schema zu erreichen?
Vielen Dank für Ihre Zeit
aktualisiert
Ich vermute, dass das Problem aus der erzeugten Bohne kommt, weil das Problem mit der folgenden Bohne
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
@XmlRootElement(name = "TDetails_XCC")
public class TeamDetailsRequestType
extends SimpleRESTRequestType
implements Serializable
{
}
So gelöst ist, wie kann ich meine XSD ändern, um JAXB die Name Eigenschaft innerhalb von @ XmlRootElement i setzen anstelle von @ XmlType?
Thanks again