2016-08-03 8 views
0

私は要求がシリアル化されたXMLとして送信代わりにJAXBクラス名注釈

は、ここで例

このことから
https://localhost:9985/fr_FR/api.ReceiveXMLmessage?xmlString=<TDetails_XCC OpeType="SOME_OPERATION"><TeamID>SOME_ID</TeamID></TDetails_XCC> 

あるオブジェクトされているREST Webサービスを消費しようとしているの複合型の名前を使用してマーシャリング、私は、次のXSDスキーマ

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

これで生成されたJava Beanに

012を作成しました

これはXMLにBeanをシリアル化するために使用されるコード

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

これは、マーシャリングさBeanは

私は

<TDetails_XCC OpeType="SomeOperation"> 
    <TeamID>546464</TeamID> 
</TDetails_XCC> 
を得たかったものを
<teamDetailsRequestType OpeType="SomeOperation"> 
    <TeamID>546464</TeamID> 
</teamDetailsRequestType> 

そして、このように見えるものです

QNameクラスを使用して動作させることができました

JAXBElement jx = new JAXBElement(new QName("TDetails_XCC"), request.getClass(), request); 
marshaller.marshal(jx, System.out); 

しかし、私が知りたいことは、これをXSDスキーマから単独で実行できるかどうかです。

は問題が

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType 
@XmlRootElement(name = "TDetails_XCC") 
public class TeamDetailsRequestType 
    extends SimpleRESTRequestType 
    implements Serializable 
    { 
    } 

だから、どのように以下の豆で解決されているので、私は、問題が発生した豆から来ていることを推測している

更新

お時間をいただき、ありがとうございます私はXSDをJAXBに変更することができます名前の中のプロパティ@ XmlRootElement私は@XmlTypeのnstead?ここ

おかげで再び

答えて

0

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

としては、複雑型用@XmlRootElement注釈を生成するために多くの解決策の一つ、this StackOverflow threadで説明した解決策は、として宣言することです匿名複合型(名前付き要素で囲まれている)

関連する問題