2012-10-19 106 views
1

我在想如果Mule會在http端點上創建一個wsdl,所以我可以通過soapUI來訪問它。我使用soap信封傳遞xml,如下所示。我沒有創建wsdl,但是之後我有一個流來讀取和使用這個xml被傳入。我知道在其他ESB工具中可以說這個端點需要公開一個wsdl,並且它會創建一個用於你在建立。騾子會做這樣的事嗎?Mule在http端點上創建wsdl

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<soapenv:Header/> 
<soapenv:Body> 
    <lookup> 
     <bookid>0028634748</bookid> 
    </lookup> 
</soapenv:Body> 

感謝您的時間。

回答

1

Mule可以即時生成WSDL,但它需要東西來推斷WSDL。它可以從一個純POJO組件來完成,而無需任何JAX-WS註釋,並且被配置如下:

<flow name="bookLookupService"> 
    <http:inbound-endpoint address="http://localhost:8181/bls" 
     exchange-pattern="request-response"> 
     <cxf:simple-service serviceClass="com.acme.BookLookupService" /> 
    </http:inbound-endpoint> 
    <component class="com.acme.BookLookupServiceImpl" /> 
</flow> 

隨着如下界面:

package com.acme; 

public interface BookLookupService 
{ 
    public static class BookLookup 
    { 
     private String bookid; 

     public String getBookid() 
     { 
      return bookid; 
     } 

     public void setBookid(final String bookid) 
     { 
      this.bookid = bookid; 
     } 
    } 

    public static class Book 
    { 
     private String bookid, name; 

     public String getBookid() 
     { 
      return bookid; 
     } 

     public void setBookid(final String bookid) 
     { 
      this.bookid = bookid; 
     } 

     public String getName() 
     { 
      return name; 
     } 

     public void setName(final String name) 
     { 
      this.name = name; 
     } 
    } 

    Book lookup(final BookLookup bookLookup); 
} 

和執行:

package com.acme; 

public class BookLookupServiceImpl implements BookLookupService 
{ 
    public Book lookup(final BookLookup bookLookup) 
    { 
     final Book book = new Book(); 
     book.setName("LOTR"); 
     book.setBookid(bookLookup.getBookid()); 
     return book; 
    } 
} 

問題是WSDL將不符合上面的預期消息,最終得到如下消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acme="http://acme.com/" xmlns:acme1="http://acme.com"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <acme:lookup> 
     <acme:arg0> 
      <acme1:bookid>ABC123</acme1:bookid> 
     </acme:arg0> 
     </acme:lookup> 
    </soapenv:Body> 
</soapenv:Envelope> 

如果您希望對生成的WSDL進行更嚴格的控制,則必須使用JAX-WS/JAXB註釋。

+1

不是我所希望的,但它回答了問題並提供瞭解決方案。我希望端點能夠在爲流創建WSDL方面發揮更好的作用。而不僅僅是創建Web服務的自下而上或自上而下的方法。可能還有其他方法,但謝謝你的答案。 – bbotz

+0

或者,您可以手工製作WSDL(因爲顯然沒有任何Mule/CXF可以從中推斷出它),並在GET請求上向HTTP端點提供服務。但是,再次,這不會做你以後的自動生成的WSDL生成:) –