使用XStream通过线路发送的String的反序列化问题 [英] Problem with deserialization of String sent over wire with XStream

查看:396
本文介绍了使用XStream通过线路发送的String的反序列化问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个简单的Web服务,它将String作为输入并返回字符串作为输出。
我正在使用Ecelipse Helios和Axis 2.15。

I am trying to create a simple webservice which takes a String as input and returns string as output. I am using Ecelipse Helios and Axis 2.15.


  1. 我正在为此编写简单的WSDL。

  2. 我正在使用代码生成器生成存根。
  1. I am writing simple WSDL for the same.
  2. I am generating the stubs using code generator.

新建 - >代码生成器 - >来自wsdl的java类 - >给出WSDL并生成java骨架。

  • 并且在skelton中我只是打印出来的值作为参数。返回相同的值。

  • 我编写了客户端代码来调用webservice的方法。这需要一个字符串。

  • 但是当我尝试调用该方法时,我遇到异常并且它没有访问web服务。

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

  • And in the skelton I am just print the value what is coming as parameter. and returning the same value.
  • I have written client code to invoke the method of the webservice. which takes a String.
  • but when I am trying to invoke the method I am getting following exception and it's not hitting the webservice.
  • 事实上,我正在使用XStream和Client / WebService。

    Infact I am using XStream along with Client/WebService.

    代码进入像这样的web服务骨架:

    Code goes like this for the webservice skeleton:

    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,存在于客户端和Web服务端。

    SOVO is a simple POJO which is present at both client and webservice side.

    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是这里:

    And last but most important WSDL is here:

    <?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>
    

    我必须修改的异常的堆栈跟踪:

    And the Stack trace for the exception I must modify :

    我不确定它是否点击了webservice层。

    I am not very sure if its hitting the webservice layer.

    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 desirialization的一些问题。尽管SOVO在类路径中为什么会发生?我错过了什么吗?

    It looks like more its some problem with XStream desirialization. Even though SOVO is in the classpath why its happening? Am I missing something?

    当我尝试将XXXXX作为字符串发送时,它告诉:

    When I try sending XXXXX as string it tells:


    在开始标记之前只允许空白内容而不是X(位置:START_DOCUMENT看到X ... @ 1:1)

    only whitespace content allowed before start tag and not X (position: START_DOCUMENT seen X... @1:1)

    我尝试发送一些价值它说:

    When i try sending "some value" it says:


    只有在开始标记之前允许的空白内容而不是s(位置:START_DOCUMENT看到s .. 。@ 1:1)

    only whitespace content allowed before start tag and not s (position: START_DOCUMENT seen s... @1:1)

    我不确定是什么问题。

    推荐答案

    我建议如下:

    使用其他客户端测试服务

    使用 soapUI 生成有效的测试请求你的 showInput 方法。如果您使用此工具没有收到任何错误,您就知道您的服务正常运行。如果您收到错误,那么您就知道要开始在服务代码中进行挖掘。

    Use soapUI to generate a valid test request for your showInput method. If you don't get any errors using this tool, you know your service is working fine. If you do get an error, then you know to start digging around in your service code.

    为SOAP启用客户端日志记录消息

    在运行客户端时添加以下JVM选项:

    Add these JVM options when running your client:

    -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消息。密切注意出现在开始标记之前的内容,如错误消息所示。

    This will let you to see the SOAP messages that get transmitted. Pay close attention to content appearing before your start tags like the error message says.

    这篇关于使用XStream通过线路发送的String的反序列化问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆