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

Java 使用Spring代理时,如何查看和调试web服务响应?,java,web-services,spring,response,Java,Web Services,Spring,Response,我正在编写一个Java+Spring客户端,它调用远程web服务。我知道我正确地点击了web服务,因为如果我发送了一个错误的id,我会从服务收到一个自定义SOAP异常,表示没有具有该id的学生。但是如果我发送了一个有效的id,则调用返回的StudentObject为null。我有另一个方法用于在他们的系统中创建一个学生,该方法返回一个带有新id的字符串。同样,我知道这是可行的(我检查了主机系统上的数据),但我的返回值为null 因此,我希望能够检查来自web服务的响应,以了解我们到底得到了什么,

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

因此,我希望能够检查来自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创建服务(然后自动连接并注入我的应用程序):


}

我建议暂时不要使用Spring,尝试一下。它可以让您轻松地制定请求,并在响应返回时查看响应的所有细节。

一种方法是使用tcpmon(http://java.net/projects/tcpmon/)设置代理。使其侦听端口并将其转发到服务器。所有请求/响应都将被记录。

这种方法最终比SOAP UI(这也是一个非常好的工具)更适合我,因为我可以准确地看到我的应用程序发送和接收的内容。虽然问题更多地涉及调试问题,但通过添加@SOAPBinding最终解决了空对象问题(style=SOAPBinding.style.RPC)添加到我的服务接口。我完全错过了wsdl的绑定部分(这是一个大文件),在该部分中,样式被设置为“RPC”。添加SOAPBinding注释使一切正常。此外,我还能够从方法中删除@RequestWrapper和@ResponseWrapper注释。
<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>
<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>
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() {
    }