написать клиент веб-службы Java Spring для обслуживания сейчас - PullRequest
2 голосов
/ 17 февраля 2012

Моя настройка следующая. У меня есть пружинный компонент org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean, использующий этот интерфейс:

<bean id="snIncidentService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="wsdlDocumentUrl" value="https://subdom.service-now.com/incident.do?WSDL" />
    <property name="namespaceUri" value="http://www.service-now.com" />
    <property name="serviceName" value="ServiceNow_incident" />
    <property name="portName" value="ServiceNowSoap" />
    <property name="serviceInterface" value="edu.liberty.webservice.SNIncident" />
    <property name="username" value="****" />
    <property name="password" value="****" />
</bean>


package edu.liberty.webservice;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "ServiceNowSoap", targetNamespace = "http://www.service-now.com/incident")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT)
public interface SNIncident {

    @WebMethod(operationName = "insert", action = "http://www.service-now.com/incident/insert")
    @WebResult(name = "insertResponse", targetNamespace = "http://www.service-now.com/incident")  
    public InsertResponse insert(@WebParam(name="insert", targetNamespace = "http://www.service-now.com/incident") Insert inc);
}

Insert.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"skills",
"uponApproval",

... (еще около 50 аргументов)

@XmlRootElement(name = "insert", namespace="http://www.service-now.com/incident")
public class Insert {

protected String skills;
@XmlElement(name = "upon_approval")
protected String uponApproval;

.. (те же аргументы)

Я могу позвонить в веб-сервис, и сервис теперь создает инцидент, но он не принимает во внимание аргументы, которые яперейти к нему.

    Insert inc = new Insert();

    inc.setPriority(new BigInteger("1"));
    inc.setShortDescription("test WS");

    incidentService.insert(inc);

Сообщение SOAP:

<?xml version="1.0" encoding="UTF-8"?> 
  <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
      <ns2:insert xmlns:ns2="http://www.service-now.com/incident"> 
        <ns2:insert> 
          <priority>1</priority> 
          <short_description>test WS</short_description> 
        </ns2:insert>
      </ns2:insert>
     </S:Body>
   </S:Envelope>

Я считаю, что проблема заключается во втором теге вставки, но я не могу понять, как остановить его отправку.

WSDL можно увидеть на демонстрационном сайте службы в настоящее время здесь:

https://demo05.service -now.com /ident.do? WSDL

user: admin

pw: admin

Когда я использую wsimport, метод сервиса, который он создает, включает в себя все 67 аргументов в вызове метода сервиса.К сожалению, это работает.Я действительно хочу абстрагировать все эти аргументы в объект.Есть ли способ заставить java развернуть объект Insert без добавления дополнительного тега insert к сообщению SAOP?

1 Ответ

1 голос
/ 21 февраля 2012

Похоже, проблема в том, что вы называете свой объект Insert как параметр, который является вторым "

Может быть (должен?) Быть лучший вариант, но вот тот, который я нашел, кажется, работает:

Изменение метода вставки для получения параметров (именованных и без пространства имен) вместо объекта вставки должно исправить это.

public InsertResponse insert(
           @WebParam(name="priority", targetNamespace = "") BigInteger priority,
           @WebParam(name="short_description", targetNamespace = "") String shortDescription,
           @WebParam(name="assigned_to", targetNamespace = "") String assignedTo
);

Добавьте необходимые параметры для всего, что вы пытаетесь сделать.

...