Как я могу увидеть и отладить ответ веб-службы при использовании Spring proxy?

#java #web-services #spring #response

#java #веб-службы #spring #ответ

Вопрос:

Я пишу клиент Java Spring, который обращается к удаленной веб-службе. Я знаю, что я правильно подключаюсь к веб-службе, потому что, если я отправляю неверный идентификатор, я получаю пользовательское исключение SOAP от службы, в котором говорится, что нет учащегося с этим идентификатором. Но если я отправлю действительный идентификатор, StudentObject, возвращаемый из вызова, будет равен null. У меня есть другой метод, используемый для создания student в их системе, который возвращает строку с их новым идентификатором. Опять же, я знаю, что это работает (я проверил данные в системе хоста), но мое возвращаемое значение равно null.

Итак, я хотел бы иметь возможность изучить ответ веб-службы, чтобы знать, что именно мы получаем обратно и почему это неправильно отображается в объект. Я хотел бы увидеть ответ, записанный в журнал, но я не могу понять, как получить этот ответ. Как мне это сделать?

Я определил интерфейс к веб-сервису следующим образом:

 @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() {
    }
  

}

Комментарии:

1. Хотя вопрос больше касался проблемы отладки, нулевой объект был решен в конечном итоге путем добавления @SOAPBinding(style=SOAPBinding. Стиль. RPC) к моему интерфейсу службы. Я полностью пропустил раздел привязки wsdl (это большой файл), где стиль был установлен на «rpc». Добавление аннотации SOAPBinding заставило все работать. Кроме того, я смог удалить аннотации @RequestWrapper и @ResponseWrapper из своих методов.

Ответ №1:

Один из способов сделать это — использовать tcpmon (http://java.net/projects/tcpmon /) для настройки прокси. Заставьте его прослушивать порт и пересылать его на сервер. Все запросы / ответы будут регистрироваться.

Комментарии:

1. В конечном итоге этот подход сработал для меня лучше, чем SOAP UI (который также является действительно отличным инструментом), просто потому, что я мог точно видеть, что мое приложение отправляло и получало.

Ответ №2:

Я бы рекомендовал пока не использовать Spring и попробовать SOAP UI. Это позволит вам легко формулировать запросы и просматривать все детали ответа, когда он возвращается.