2017-06-17 7 views
2

私はSOAPリクエストをポストするためにレトロフィットネットワークコントローラを使用しています。 @Bodyはorg.simpleframework.xmlを使用してクラス内にxmlを生成しています。ボディー最初にして石鹸::ヘッダークラ​​ス構造がorg.simpleframework.xmlを使用したRetrofit BodyクラスのXMLオーダー

@Root(name = "soap:Envelope") 

@NamespaceList({ 
     @Namespace(prefix = "soap", reference = ""), 
     @Namespace(prefix = "typ", reference = ""), 
     @Namespace(prefix = "ldb", reference = "") 
}) 


public class RequestEnvelope { 

    @Element(name = "soap:Header") 
    RequestHeader requestHeader; 

    public void setRequestHeader(RequestHeader requestHeader) { 
     this.requestHeader = requestHeader; 
    } 

    public RequestHeader getRequestHeader() { 
     return requestHeader; 
    } 


    @Element(name = "soap:Body") 
    RequestBody requestBody; 


    public void setRequestBody(RequestBody requestBody) { 
     this.requestBody = requestBody; 
    } 

    public RequestBody getRequestBody() { 
     return requestBody; 
    } 
} 

を追っているように私が午前問題は、石鹸の構造として提出され、体内で生成されたXMLということです。これは、soap:Headerが最初である必要があるため、api呼び出しが失敗する原因となります。私は@Order(elements = {"soap:Header", "soap:Body"})を使用しようとしましたが、アプリケーションはクラスにsoap:Headerまたはsoap:Bodyというラベルの要素がないことを伝えます。

私は以前このクラスを単一の要素で使用しましたが、複数の要素に問題があるようです。私が見ることができるところから、返品はアルファベット順に並べられています。

誰かが生成されたXMLでアルファベット順を停止する方法を知っていますか?私は過去にこの問題に直面し、YES、@Order注釈で問題が解決しない

おかげ

答えて

0

。面白い...私は、変数の名前をアルファベット順に変更することで問題を解決しました。私の場合、 "body"(変数名)に "z"を追加し、クラスをチェックして、お試しください。

@Root(name = "soap12:Envelope") 
@NamespaceList({ 
     @Namespace(prefix = "xsi", reference = "http://www.w3.org/2001/XMLSchema-instance"), 
     @Namespace(prefix = "xsd", reference = "http://www.w3.org/2001/XMLSchema"), 
     @Namespace(prefix = "soap12", reference = "http://www.w3.org/2003/05/soap-envelope") 
}) 

public class CardSaleRequestEnvelope { 

    @Element(name = "soap12:Header", required = true) 
    private CardSaleRequestHeader header; 

    @Element(name = "soap12:Body", required = true) 
    private ZCardSaleRequestBody zbody; 

    public CardSaleRequestEnvelope() { 
    } 


    public CardSaleRequestHeader getHeader() { 
     return header; 
    } 

    public void setHeader(CardSaleRequestHeader header) { 
     this.header = header; 
    } 

    public ZCardSaleRequestBody getBody() { 
     return zbody; 
    } 

    public void setBody(ZCardSaleRequestBody zbody) { 
     this.zbody = zbody; 
    } 
} 
0

構文が間違っているためです。 あなたが試すことができます:

@Root(name = "soap:Envelope") 
@NamespaceList({ 
     @Namespace(prefix = "soap", reference = ""), 
     @Namespace(prefix = "typ", reference = ""), 
     @Namespace(prefix = "ldb", reference = "") 
}) 

@Order(elements = {"soap:Envelope/soap:Header", "soap:Envelope/soap:Body"}) 

public class RequestEnvelope { 

@Element(name = "soap:Header") 
RequestHeader requestHeader; 

public void setRequestHeader(RequestHeader requestHeader) { 
    this.requestHeader = requestHeader; 
} 

public RequestHeader getRequestHeader() { 
    return requestHeader; 
} 


@Element(name = "soap:Body") 
RequestBody requestBody; 


public void setRequestBody(RequestBody requestBody) { 
    this.requestBody = requestBody; 
} 

public RequestBody getRequestBody() { 
    return requestBody; 
} 
} 
+0

このソリューションは機能していません。 –

0

があなたの変数の名前を保つことができます実用的なソリューションがありますが、あなたは接頭辞の代わり@Element(name)ため@Namespace(reference)を使用する必要があります。私はそれが非常にきれいに見えないと知っているとあなたは@Namespace(prefix)があまりにも動作すると思います - それはないでしょう。

@Root(name = "soap:Envelope", strict = false) 
@NamespaceList({ 
     @Namespace(reference = "http://www.w3.org/2003/05/soap-envelope", 
       prefix = "soap") 
}) 
@Order(elements = {"Header", "Body"}) 
public class LoginRequest { 

    @Element(name = "Header") 
    @Namespace(reference = "http://www.w3.org/2003/05/soap-envelope") 
    public Header header; 

    @Element(name = "Body") 
    @Namespace(reference = "http://www.w3.org/2003/05/soap-envelope") 
    public Body body; 

    public LoginRequest() { 
    } 

    ... 
} 

出典:

関連する問題