Проблема с десериализацией строки, отправленной по проводам с помощью XStream - PullRequest
3 голосов
/ 08 августа 2011

Я пытаюсь создать простой веб-сервис, который принимает строку в качестве входных данных и возвращает строку в качестве выходных.Я использую Ecelipse Helios и Axis 2.15.

  1. Я пишу простой WSDL для того же.
  2. Я генерирую заглушки с помощью генератора кода.

    Новый -> генератор кода -> класс java из wsdl-> дает WSDL и генерирует скелеты java.

  3. А в skelton я просто печатаю значение, которое приходит в качестве параметра.и возвращая то же значение.
  4. Я написал клиентский код для вызова метода веб-службы.который принимает строку.
  5. , но когда я пытаюсь вызвать метод, я получаю следующее исключение, и он не попадает в веб-сервис.

Infact Я использую XStream вместе с Client /WebService.

Код выглядит так для скелета веб-службы:

public com.url.pkg.ShowInputResponse showInput(
        com.url.pkg.ShowInput showInput) {
    // TODO : fill this with the necessary business logic
    String inputString = showInput.getInputString();
    System.out.println("INput String is :\n" + inputString);
    XStream xStream = new XStream();
    System.out.println("After XStream Declaration...");
    SOVO vo = null;
    try {
        vo = (SOVO) xStream.fromXML(inputString);
    } catch (Throwable e) {
        System.out.println(e);
        e.printStackTrace();
    }
    System.out.println("After SOVO casting from XML");
    System.out.println(vo.getName());
    System.out.println(vo.getParams());
    // TODO: business logic
    ShowInputResponse response = new ShowInputResponse();
    response.set_return(inputString);
    return response;
}

Мой код клиента выглядит так:

public static void main(String[] args) throws Exception {
        BasicServiceStub stub = new BasicServiceStub();
        ShowInput request = new ShowInput();
        SOVO sovo = new SOVO();
        sovo.setName("I am the post for SO");
        Map params = new HashMap();
        params.put("key1", "val1");
        params.put("key2", "val2");
        sovo.setParams(params);
        XStream xStream = new XStream();
        String soVoString = xStream.toXML(sovo);
        // System.out.println(soVoString);
        request.setInputString(soVoString);
        ShowInputResponse response = stub.showInput(request);
        System.out.println("....................................");
        System.out.println("response = " + response.get_return());
    }

SOVO isпростой POJO, который присутствует как на стороне клиента, так и на стороне веб-сервиса.

public class SOVO {

    private String name;
    private Map params;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Map getParams() {
        return params;
    }

    public void setParams(Map params) {
        this.params = params;
    }

}

И последний, но самый важный WSDL здесь:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://pkg.url.com" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://pkg.url.com">
    <wsdl:types>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://pkg.url.com">
            <xs:element name="showInput">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="inputString" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="showInputResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="showInputRequest">
        <wsdl:part name="parameters" element="ns:showInput"/>
    </wsdl:message>
    <wsdl:message name="showInputResponse">
        <wsdl:part name="parameters" element="ns:showInputResponse"/>
    </wsdl:message>
    <wsdl:portType name="BasicServicePortType">
        <wsdl:operation name="showInput">
            <wsdl:input message="ns:showInputRequest" wsaw:Action="urn:showInput"/>
            <wsdl:output message="ns:showInputResponse" wsaw:Action="urn:showInputResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BasicServiceSoap11Binding" type="ns:BasicServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="showInput">
            <soap:operation soapAction="urn:showInput" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="BasicServiceSoap12Binding" type="ns:BasicServicePortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="showInput">
            <soap12:operation soapAction="urn:showInput" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="BasicServiceHttpBinding" type="ns:BasicServicePortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="showInput">
            <http:operation location="BasicService/showInput"/>
            <wsdl:input>
                <mime:content type="text/xml" part="showInput"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="showInput"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="BasicService">
        <wsdl:port name="BasicServiceHttpSoap11Endpoint" binding="ns:BasicServiceSoap11Binding">
            <soap:address location="http://localhost:8080/axis2/services/BasicService"/>
        </wsdl:port>
        <wsdl:port name="BasicServiceHttpSoap12Endpoint" binding="ns:BasicServiceSoap12Binding">
            <soap12:address location="http://localhost:8080/axis2/services/BasicService"/>
        </wsdl:port>
        <wsdl:port name="BasicServiceHttpEndpoint" binding="ns:BasicServiceHttpBinding">
            <http:address location="http://localhost:8080/axis2/services/BasicService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

И трассировка стека для исключения, которое я должен изменить:

Я не очень уверен, попал ли он в слой веб-сервиса.

Caused by: org.apache.axis2.AxisFault: string
    at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:446)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:371)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
        at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
        at com.url.pkg.BasicServiceStub.showInput(BasicServiceStub.java:184)
        at com.url.pkg.Client.main(Client.java:30)

Похоже, что это некоторая проблема с десериализацией XStream.Несмотря на то, что СОВО находится в классе, почему это происходит?Я что-то пропустил?

Когда я пытаюсь отправить XXXXX в виде строки, она сообщает:

разрешен только пробельный контент перед начальным тегом, но не X (позиция: START_DOCUMENT видел X ... @1: 1)

Когда я пытаюсь отправить «какое-то значение», оно говорит:

разрешено только пустое содержимое перед начальным тегом, но не s (позиция: START_DOCUMENT видел s... @ 1: 1)

Я не уверен, что не так.

1 Ответ

2 голосов
/ 30 августа 2011

Я бы предложил следующее:

Протестируйте службу с другим клиентом

Используйте soapUI , чтобы сгенерировать действительный тестовый запрос для вашего showInput метод.Если вы не получили никаких ошибок при использовании этого инструмента, вы знаете, что ваш сервис работает нормально.Если вы do получаете сообщение об ошибке, вы знаете, как начать копаться в своем сервисном коде.

Включить ведение журнала на стороне клиента для сообщений SOAP

При запуске клиента добавьте следующие параметры JVM:

-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
-Dorg.apache.commons.logging.simplelog.showdatetime=true
-Dorg.apache.commons.logging.simplelog.log.httpclient.wire=debug
-Dorg.apache.commons.logging.simplelog.log.org.apache.commons.httpclient=debug

Это позволит вам видеть сообщения SOAP, которые передаются.Обратите особое внимание на содержимое, появляющееся перед вашими начальными тегами, как показано в сообщении об ошибке.

...