Я пишу клиент Java + Spring, который обращается к удаленному веб-сервису. Я знаю, что правильно обращаюсь к веб-службе, потому что, если я отправляю неверный идентификатор, я получаю специальное SOAP-исключение от службы, в котором говорится, что нет ученика с таким идентификатором. Но если я отправлю верный идентификатор, StudentObject, возвращенный из вызова, будет нулевым. У меня есть другой метод, используемый для создания студента в их системе, который возвращает строку с новым идентификатором. Опять же, я знаю, что это работает (я проверил данные в системе хоста), но мое возвращаемое значение равно нулю.
Так что я хотел бы иметь возможность изучить ответ веб-службы, чтобы узнать, что именно мы получаем, и почему он не отображается на объект правильно. Я хотел бы видеть ответ записанный в журнал, но я не могу понять, как получить этот ответ. Как мне это сделать?
Я определил интерфейс к веб-сервису так:
@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() {
}
}