【问题标题】:Mule create wsdl on http endpointMule 在 http 端点上创建 wsdl
【发布时间】:2012-10-20 01:52:28
【问题描述】:

我想知道 Mule 是否会在 http 端点上创建一个 wsdl,以便我可以通过soapUI 访问它。我用肥皂信封传入 xml,如下所示。我没有创建 wsdl,但之后我有一个流程来读取和使用传入的这个 xml。我知道使用其他 ESB 工具可以说这个端点需要公开一个 wsdl,它会为你在构建。骡子会这样做吗?

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

感谢您的宝贵时间。

【问题讨论】:

    标签: http wsdl esb mule


    【解决方案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 注释。

    【讨论】:

    • 不是我所希望的,但它回答了问题并提供了问题的解决方案。我曾希望端点能够更好地为流创建 WSDL。而不仅仅是创建 Web 服务的自下而上或自上而下的方法。可能还有其他方法,但感谢您的回答。
    • 另外,您可以手工制作 WSDL(因为显然 Mule/CXF 无法从中推断出它)并在对 HTTP 端点的 GET 请求中提供它。但同样,这并不能实现您所追求的自动 WSDL 生成 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多