Проблема с десериализацией строки, отправленной по сети с помощью XStream

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

  1. Я пишу простой WSDL для того же.
  2. I am generating the stubs using code generator.

    New ->code generator -> java class from wsdl-> give WSDL and generates the java skeletons.

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

Infact I am using XStream along with 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 — это простой 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. Хотя SOVO находится в пути к классам, почему это происходит? Я что-то упускаю?

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

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

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

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

Я не уверен, что случилось.


person PriWeb    schedule 08.08.2011    source источник
comment
Можете ли вы опубликовать WSDL и некоторый код?   -  person Thomas    schedule 08.08.2011
comment
Как сказал @Thomas, WSDL был бы отличным... клиентский код тоже   -  person home    schedule 08.08.2011
comment
Я бы посоветовал убедиться, что ваш веб-сервис работает правильно, протестировав его с помощью обозревателя веб-сервисов (Выполнить -> нижний элемент. Я предполагаю, что вы используете Eclipse).   -  person    schedule 09.08.2011
comment
Я опубликую клиентский код, скелет и wsdl в ответе. Комментарий bcoz будет слишком коротким. Спасибо, что вернулись и прокомментировали Thomas/bdares.   -  person PriWeb    schedule 09.08.2011


Ответы (1)


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

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

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

Включить ведение журнала на стороне клиента для сообщений 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. Обратите особое внимание на содержимое, появляющееся перед вашими начальными тегами, как говорится в сообщении об ошибке.

person jkeeler    schedule 29.08.2011