2016-08-03 37 views
0

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 bekommen
JAXBElement 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

Antwort

0

Hier ist die Lösung

<element name="TDetails_XCC"> 
    <annotation> 
     <appinfo> 
      <jaxb:class name="TeamDetailsRequestType"/> 
     </appinfo> 
     <documentation>Request team details</documentation> 
    </annotation> 
    <complexType> 
     <complexContent> 
      <extension base="local:SimpleRESTRequestType"/> 
     </complexContent> 
    </complexType> 
</element> 

Wie in this StackOverflow thread erklärt, eine der vielen Lösungen, die die @XmlRootElement Anmerkung für einen Complex zu erzeugen, ist es als ein zu erklären anonym ComplexType (dh in ein benanntes Element eingeschlossen)