masalah tag XML yang tidak terduga dengan klien Jax Ws

Saya menggunakan layanan web vendor. Menghasilkan kelas menggunakan wsimport JDK6 untuk vendor WSDL. Sekarang saya mencoba memanggil layanan web menggunakan kelas klien Java sederhana dan mendapatkan pengecualian ini dengan respons.

Tag XML tak terduga. diharapkan: {http://www.abcd.com/addressValidation/}validateAddressResponse tetapi ditemukan: {} validasiAddressResponse

Vendor mengatakan coba dengan kelas yang dihasilkan Apache Axis, itu berfungsi dengan baik. Apa yang saya perhatikan adalah JaxWS secara otomatis menambahkan/mengikat namespace ke setiap elemen dalam permintaan dan juga mengharapkan namespace di elemen respons.

Antarmuka yang dihasilkan adalah

    @WebService(name = "AddressStandardize", targetNamespace = "http://www.abcd.com/addressValidation/")
@XmlSeeAlso({
    com.abcd.ObjectFactory.class
})
public interface AddressStandardize {

    @WebMethod(action = "http://www.abcd.com/standardizeAddress")
    @RequestWrapper(localName = "validateAddress", targetNamespace = "", className = "com.abcd.ValidateAddress")
    @ResponseWrapper(localName = "validateAddressResponse", targetNamespace = "", className = "com.abcd.ValidateAddressResponse")
    public void standardizeAddress(
    ...
    ...
    ...
    );
}

Saya kira Jax-WS menambahkan namespace target ini ke elemen validasiAddress dan validasiAddressResponse.

Cara menghindari pengikatan namespace target ke elemen validasiAddressResponse sehingga tidak mengharapkan respons balik. Mohon bantuannya!

Permintaan yang dibuat Jax WS:

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Header>
        <ns2:id xmlns:ns2="http://www.abcd.com/addressValidation/">PSA</ns2:id>
    </S:Header>
    <S:Body>
        <ns2:validateAddress xmlns:ns2="http://www.abcd.com/addressValidation/">
            <arg1>
                <addresslineone>126 corbin st</addresslineone>
                <addresslinetwo/>
                <addresslinethree/>
                <city>jersey city</city>
                <state>NJ</state>
                <postalcode/>
                <country/>
                <isocountrycode>US</isocountrycode>
            </arg1>
        </ns2:validateAddress>
    </S:Body>
</S:Envelope>

Respon Pengembalian:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xyz="http://www.abcd.com/xyz">
    <soapenv:Header xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xyz:id>PSA</xyz:id>
    </soapenv:Header>
    <soapenv:Body xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <validateAddressResponse xsi:noNamespaceSchemaLocation="addressValidation.xsd">
            <validateAddressReturn>
                ...
                ...
                ...
            </validateAddressReturn>
            <ResponseStatus>
                <StatusCode>SUCCESS</StatusCode>
            </ResponseStatus>
        </validateAddressResponse>
    </soapenv:Body>
</soapenv:Envelope>

Tanggapan ini datang dengan pengecualian ini... tag XML yang tidak terduga. diharapkan: {http://www.abcd.com/addressValidation/}validateAddressResponse tetapi ditemukan: {} validasiAlamatResponse


person Gouse1123    schedule 26.08.2015    source sumber


Jawaban (1)


Saya juga mengalami masalah ini, dan tidak dapat menemukan cara untuk memberitahu JAX-WS agar tidak mengharapkan namespace. Namun, saya dapat mengatasinya dengan melakukan pra-pemrosesan respons di SOAPHandler dan secara manual menambahkan namespace ke elemen XML (dengan memberinya QName baru yang menyertakan deklarasi namespace).

MyHandler.java:

public class MyHandler implements SOAPHandler<SOAPMessageContext> {
    @Override
    public void close(MessageContext context) { 
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        //Don't intercept outbound messages (SOAP Requests)
        if ((Boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) {return true;}

        SOAPMessage message = context.getMessage();
        try {
            SOAPBody body = message.getSOAPBody();
            Iterator<SOAPElement> bodyIterator = body.getChildElements();
            SOAPElement responseElement = bodyIterator.next();
            responseElement.setElementQName(new QName("http://www.theserver.com/cmdb_rel_ci", origGetRecordsResponse.getLocalName(), "cmdb"));
        } catch (Exception e) {e.printStackTrace();}
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return false;
    }

    @Override
    public Set<QName> getHeaders() {
        return Collections.emptySet();
    }
}

Kemudian saya hanya perlu menambahkan Handler saya ke HandlerChain dengan kode berikut di kelas utama saya, dan itu berhasil.

Binding binding = ((BindingProvider)port).getBinding();
List<Handler> handlers = binding.getHandlerChain();
handlers.add(new MyHandler());
binding.setHandlerChain(handlers);
person cwh711    schedule 22.04.2016