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