使用org.simpleframework.xml在Retrofit Body Class中的XML顺序

时间:2017-06-17 15:38:38

标签: java android xml soap retrofit

我正在使用改装网络控制器发布SOAP请求。 @Body正在使用org.simpleframework.xml在类中生成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的结构:Body首先然后是soap:Header。这导致api调用失败,因为它需要soap:Header是第一个。我曾尝试使用@Order(elements = {"soap:Header", "soap:Body"}),但应用程序告诉我没有标记为soap的元素:Header或soap:类中的Body。

之前我使用过这个类,但是它似乎遇到了多个元素的问题。从我所看到的,回报按字母顺序排列。

有谁知道如何在生成的xml中停止字母顺序?

由于

3 个答案:

答案 0 :(得分:1)

我过去遇到过这个问题,是的,@ Order注释并没有解决问题。有趣的是......我通过改变变量的名称来解决问题,按字母顺序排列,在我的情况下,我只是在“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;
    }
}

答案 1 :(得分: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;
}
}

答案 2 :(得分:0)

有一个可行的解决方案可以保存变量的名称,但是您必须使用@Namespace(reference)作为前缀而不是@Element(name)。我知道它看起来不是很干净你猜测@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() {
    }

    ...
}

来源: