使用Spring代理时,如何查看和调试Web服务响应?

时间:2011-04-22 13:33:59

标签: java web-services spring response

我正在编写一个调用远程Web服务的Java + Spring客户端。我知道我正确地访问了Web服务,因为如果我发送了一个错误的id,我会从服务中收到一个自定义的SOAP异常,说没有该id的学生。但是如果我发送了一个有效的id,那么从该调用返回的StudentObject为null。我有另一种方法用于在他们的系统中创建一个学生,该方法返回一个带有新id的字符串。同样,我知道这有效(我已经检查了主机系统上的数据),但我的返回值为空。

所以我希望能够检查来自Web服务的响应,以了解我们究竟要回来的内容以及为什么它没有正确映射到对象。我希望将响应写入日志中,但我无法弄清楚如何获得响应。我该怎么做?

我为web服务定义了一个接口,如下所示:

@WebService(name = "CSM_port", targetNamespace = "wsdl_namespace")
public interface TargetWebService {

    @WebMethod(operationName = "getAsObjectBySchoolID", action = "http://blah/getAsObjectBySchoolID")
    @WebResult(name = "student", targetNamespace = "namespace")
    @RequestWrapper(localName = "getAsObjectBySchoolID", targetNamespace = "namespace", className = "com.example.IDRequest")
    @ResponseWrapper(localName = "getAsObjectBySchoolIDResponse", targetNamespace = "namespace", className = "com.example.IDResponse")
    public StudentObject getStudentById(@WebParam(name = "id", targetNamespace = "namespace") String id);
}

我正在使用ProxyFactory创建服务(然后自动连接并注入我的应用程序):

<bean id="webService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="wsdlDocumentUrl" value="classpath:student_api.wsdl.xml" />
    <property name="namespaceUri" value="namespace" />
    <property name="serviceName" value="CSM_StudentWebService" />
    <property name="portName" value="CSM_StudentWebServicePort" />
    <property name="serviceInterface" value="TargetWebService" />
    <property name="username" value="user" />
    <property name="password" value="password" />
</bean>

以下是来自wsdl的相关块:

<xsd:complexType name="StudentObject">
    <xsd:all>
        <xsd:element name="student_id" type="xsd:string"/>
        <xsd:element name="school_student_id" type="xsd:string" nillable="true"/>
        <xsd:element name="fullname" type="xsd:string" nillable="true"/>
        <xsd:element name="fname" type="xsd:string" nillable="true"/>
        <xsd:element name="mi" type="xsd:string" nillable="true"/>
        <xsd:element name="lname" type="xsd:string" nillable="true"/>
        <xsd:element name="email" type="xsd:string" nillable="true"/>
        ... a billion other properties
    </xsd:all>
</xsd:complexType>
<message name="getAsObjectBySchoolIDResponse">
    <part name="student" type="tns:StudentObject"/>
</message>
<operation name="getAsObjectBySchoolID">
    <input message="tns:getAsObjectBySchoolIDRequest"/>
    <output message="tns:getAsObjectBySchoolIDResponse"/>
</operation>

最后,我的StudentObject类:

public class StudentObject {

    @XmlElement(name="student_id")
    private String symplicityId;
    @XmlElement(name="school_student_id", nillable=true)
    private String schoolId;

    @XmlElement(name="fname", nillable=true)
    private String firstName;
    @XmlElement(name="lname", nillable=true)
    private String lastName;
    @XmlElement(name="email", nillable=true)
    private String email;

    public StudentObject() {
    }

}

2 个答案:

答案 0 :(得分:2)

我建议暂时退出Spring并尝试SOAP UI。它可以让您轻松制定请求,并在回复时查看响应的所有详细信息。

答案 1 :(得分:2)

执行此操作的一种方法是使用tcpmon(http://java.net/projects/tcpmon/)来设置代理。让它在端口上侦听并将其转发到服务器。将记录所有请求/响应。