2015-06-15 6 views
12

Я могу отправить запросы на веб-службу с помощью javax.xml.soap.*, я хотел бы скрыть код для использования webServiceTemplate.Как построить SOAP-клиент весной?

  • Я борется с созданием объектов запроса и результатов. (sample Ive found относится к xml not SOAP)
  • Мне также интересно, есть ли какие-либо преимущества использования webServiceTemplate над java.xml.soap. Если я не делаю это правильно? Учитывая, что мне нужно подключиться к 20 веб-сервисам.

Единственный сервис, он имеет это findEvents следующим образом:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://ticketmaster.productserve.com/v2/soap.php" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <soap:findEvents soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <request xsi:type="soap:Request"> 
      <!--You may enter the following 7 items in any order--> 
      <apiKey xsi:type="xsd:string">?</apiKey> 
      <country xsi:type="xsd:string">?</country> 
      <resultsPerPage xsi:type="xsd:int">?</resultsPerPage> 
      <currentPage xsi:type="xsd:int">?</currentPage> 
      <sort xsi:type="soap:Request_Sort"> 
       <!--You may enter the following 2 items in any order--> 
       <field xsi:type="xsd:string">?</field> 
       <order xsi:type="xsd:string">?</order> 
      </sort> 
      <filters xsi:type="soap:ArrayOfRequest_Filter" soapenc:arrayType="soap:Request_Filter[]"/> 
      <updatedSince xsi:type="xsd:string">?</updatedSince> 
     </request> 
     </soap:findEvents> 
    </soapenv:Body> 
</soapenv:Envelope> 

Мой код выглядит следующим образом:

try { 
    SOAPConnectionFactory soapConnectionFactory = 
      SOAPConnectionFactory.newInstance(); 
    SOAPConnection connection = 
      soapConnectionFactory.createConnection(); 

    MessageFactory factory = 
      MessageFactory.newInstance(); 

    SOAPMessage message = factory.createMessage(); 

    SOAPHeader header = message.getSOAPHeader(); 
    header.detachNode(); 

    SOAPBody body = message.getSOAPBody(); 

    SOAPFactory soapFactory = 
      SOAPFactory.newInstance(); 

    Name bodyName; 
    bodyName = soapFactory.createName("findEvents", 
      "xsd", "http://ticketmaster.productserve.com/v2/soap.php"); 


    SOAPBodyElement getList = 
      body.addBodyElement(bodyName); 


    Name childName = soapFactory.createName("findEvents"); 
    SOAPElement eventRequest = getList.addChildElement(childName); 

    childName = soapFactory.createName("apiKey"); 
    SOAPElement apiKey = eventRequest.addChildElement(childName); 
    apiKey.addTextNode("MYAPI"); 

    childName = soapFactory.createName("country"); 
    SOAPElement cid = eventRequest.addChildElement(childName); 
    cid.addTextNode("UK"); 
    message.writeTo(System.out); //show message details 

    URL endpoint = new URL("http://ticketmaster.productserve.com/v2/soap.php"); 
    SOAPMessage response = 
      connection.call(message, endpoint); 

    connection.close(); 

    //SOAPBody soapBody = response.getSOAPBody(); 
    SOAPMessage sm = response; 

    System.out.println("Response:"); 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    sm.writeTo(out); 


    String validSoap = "<?xml version=\"1.0\"?> " + out.toString(); 
    System.out.println("It is ValidSoap: " + validSoap); //ValidSoap message 

    SAXBuilder builder = new SAXBuilder(); 
    Reader in = new StringReader(validSoap); //reading character stream 
    Document doc = null; //empty jDom document is instantiated 
    doc = builder.build(in); //build the jDom document 

    Element root = doc.getRootElement(); //Envelope 
    List allChildren = root.getChildren(); //list of all its child elements 
    System.out.println("Root is:" + ((Element) allChildren.get(0)).getName()); 
    listChildren(root); 

} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

Новый код

webServiceTemplate.sendSourceAndReceiveToResult 
       ("http://ticketmaster.productserve.com/v2/soap.php",source, result); 



@XmlRootElement 
public class FindEvents { 
    @XmlElement 
    Request request; 

    public Request getRequest() { 
     return request; 
    } 

    public void setRequest(Request request) { 
     this.request = request; 
    } 

} 

@XmlSeeAlso(SortTicket.class) 
public class Request { 
    @XmlElement 
    String apiKey; 
    @XmlElement 
    String country; 
    @XmlElement 
    int resultsPerPage; 
    @XmlElement 
    int currentPage; 
    @XmlElement(name = "Sort") 
    SortTicket sort; 
    @XmlElement 
    String[] filters; 
    @XmlElement 
    String updatedSince; 

    public String getApiKey() { 
     return apiKey; 
    } 

    public void setApiKey(String apiKey) { 
     this.apiKey = apiKey; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    public int getResultsPerPage() { 
     return resultsPerPage; 
    } 

    public void setResultsPerPage(int resultsPerPage) { 
     this.resultsPerPage = resultsPerPage; 
    } 

    public int getCurrentPage() { 
     return currentPage; 
    } 

    public void setCurrentPage(int currentPage) { 
     this.currentPage = currentPage; 
    } 

    public SortTicket getSort() { 
     return sort; 
    } 

    public void setSort(SortTicket sort) { 
     this.sort = sort; 
    } 

    public String[] getFilters() { 
     return filters; 
    } 

    public void setFilters(String[] filters) { 
     this.filters = filters; 
    } 

    public String getUpdatedSince() { 
     return updatedSince; 
    } 

    public void setUpdatedSince(String updatedSince) { 
     this.updatedSince = updatedSince; 
    } 

} 

public class SortTicket { 
    @XmlElement 
    String field; 
    @XmlElement 
    String order; 

    public String getField() { 
     return field; 
    } 

    public void setField(String field) { 
     this.field = field; 
    } 

    public String getOrder() { 
     return order; 
    } 

    public void setOrder(String order) { 
     this.order = order; 
    } 

} 
+0

может быть, этот вопрос лучше всего подходит для [] (Просмотр Кода HTTP: // Просмотр Кода. stackexchange.com/)? –

+0

в порядке спасибо за ваше предложение, я просто разместил на обзоре кода также http://codereview.stackexchange.com/questions/95633/need-to-convert-a-complete-code-of-javax-xml-soap-to -webservicetemplate –

+2

@NitzanVolman: Это не выглядит полностью по теме. Убедитесь, что вы прочитали Справочный центр Code Review. – Jamal

ответ

4

Поскольку вы сгенерированные классы DTO с JAXB аннотациями вы можете создать ИАС, unmarshaller и создавать объекты классов DTO (SortTicket, Request, FindEvents) и отправить объекты непосредственно вместо запроса XML

webServiceTemplate.marshalSendAndReceive(findEvents); 

Что-то вроде этого вам придется настроить.

Создать маршаллер

<oxm:jaxb2-marshaller id="marshaller" contextPath="com.yourcontextpath" /> 

создать веб-сервис шаблон

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
    <property name="marshaller" ref="marshaller" /> 
    <property name="unmarshaller" ref="marshaller" /> 
    <property name="defaultUri" 
     value="http://ticketmaster.productserve.com/v2/soap.php" /> 
</bean> 

и в методе некоторого класса, где вы хотите, чтобы отправить запрос мыла вводит webServiceTemplate с помощью @Autowired

@Autowired 
private WebServiceTemplate webServiceTemplate; 

public void sendSampleSoapRequest() { 

    SortTicket sortTicket=new SortTicket(); 
    // set its values 
    Request request=new Request(); 
    //set its values 
    request.setSort(sortTicket); 
    FindEvents findEvents=new FindEvents(); 
    setRequest(request) 
    Object response=webServiceTemplate.marshalSendAndReceive(findEvents); 
} 

marshalSendAndReceive сообщения использует Jax b marshaller для преобразования ваших объектов (отмеченных аннотацией JaxB) в xml. Таким образом, над вашим объектом findEvents будет преобразован его xml.

Что касается вашего второго пункта Преимущества использования webServiceTemplate над java.xml.soap. : вам не нужно создавать эти SOAPElements вручную, вы просто создаете объект и отправляете его вместо большого кода для его ручной обработки. Поскольку вам нужно будет подключиться к 20 различным веб-службам, вам будет намного проще создавать объекты DTO и отправлять их напрямую. Возможно, вам придется немного изменить мои примеры.Может удалить deault URI

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
    <property name="marshaller" ref="marshaller" /> 
    <property name="unmarshaller" ref="marshaller" /> 
</bean> 

и при отправке запроса дать URI Запроса

Object response=webServiceTemplate.marshalSendAndReceive(uri,object); 

Для отправки его на несколько серверов

Object response1=webServiceTemplate.marshalSendAndReceive(uri1,object); 
Object response1=webServiceTemplate.marshalSendAndReceive(uri2,object) 

uri1 и uri2 могут быть различные услуги и мыло, если у вас нет wsdl, вы можете отправить xml с помощью этого метода

sendSourceAndReceiveToResult(uri1,source, result); 
sendSourceAndReceiveToResult(uri2,source, result); 

Отправка URI в отправить метод более поездок по умолчанию URI

Например проверить this также проверить АНИ doc

+0

Спасибо, но как насчет того, нужно ли отправлять запрос нескольким веб-службам? или если у меня нет своего WSDL, как я могу настроить шаблон веб-сервиса в этих случаях? –

+0

@DanielNewtown Для отправки его на сервер множественного 'Объект response1 = webServiceTemplate.marshalSendAndReceive (uri1, объект);' ' Объект response1 = webServiceTemplate.marshalSendAndReceive (uri2, объект)' uri1 и uri2 могут быть разными службами мыла И если вы не имеете WSDL вы можете отправить XML с помощью этого метода 'sendSourceAndReceiveToResult (uri1, источник, результат);' ' sendSourceAndReceiveToResult (uri2, источник, результат);' Это зависит от ваших требований вы будете иметь для написания логики кода в зависимости от ваших потребностей. –

+0

проигнорирует ли значение defaultUri? –