14

我能够使用 向 Web 服务发送请求javax.xml.soap.*,我想隐藏要使用的代码webServiceTemplate

  • 我正在努力创建请求和结果对象。(我发现的样本与 xml 而不是 SOAP 相关)
  • 我也想知道使用 webServiceTemplate over是否有任何优势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;
    }

}
4

1 回答 1

5

由于您已经生成了带有 Jaxb 注释的 DTO 类,因此您可以创建一个编组器、解组器并创建 DTO 类 ( SortTicket, Request, FindEvents) 的对象并直接发送对象而不是使用 xml 请求

webServiceTemplate.marshalSendAndReceive(findEvents);

像这样的东西你必须配置。

创建编组器

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

创建 Web 服务模板

<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消息使用 Jaxb 编组器将您的对象(标有 JaxB 注释)转换为 xml。因此,您的findEvents对象将从上面转换为它的 xml。

关于您的第二点 使用webServiceTemplatejava.xml.soap 的优势。:您不必手动创建那些 SOAPElement,您只需创建一个对象并发送它,而不是手动处理它的大代码。由于您必须连接到 20 个不同的 Web 服务,因此您可以更轻松地创建 DTO 对象并直接发送它们。您可能需要稍微修改我上面的示例。可能会删除默认 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);

在send方法中发送 uri 会覆盖默认 URI

例如检查这个也检查 api doc

于 2015-07-10T04:41:55.600 回答