用于为REST服务创建客户端存根的java工具

时间:2014-03-11 19:59:17

标签: java rest cxf wadl

假设我已经为REST Web服务提供了WADL,并且我已经能够在SoapUI中组合一堆请求(我对REST或SOAP并不陌生) - 而且我和#39;我设法让wadl2java工具自动生成并编译我的WADL中的类。

是否有任何教程演示如何使用这些类来访问我的REST Web服务?理想情况下,我希望避免使用大型框架(Spring可能很好,但我现在希望将依赖关系保持在最低限度)。

这个网址提供了使用wadl2java的提示,但是,似乎没有人提供在可行教程中实际使用工作产品的任何示例? create client side java classes from a RESTful service in CXF

编辑:我正在使用wadl2java maven插件,非常棒。除了我发现的一个错误之外,它可以完美地生成(并编译)存根代码。我将查看下面提供的一些答案并添加我的反馈。

编辑13 / Mar:
Maven cxf-wadl2java-plugin创建了文件:target \ generated-sources \ cxf \ com \ example \ services \ v2 \ package-info.java:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/services/v2",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.example.services.v2;

看起来这不是我希望的简单解决方案 作为参考,我得到的错误是: [com.sun.istack.SAXException2:无法编组类型" com.example.services.v2.ModelCriteria"作为元素,因为它缺少@XmlRootE 注释]

我最终使用的代码:

    JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
    bean.setAddress("https://example.com/services/v2/rest");
    bean.setUsername(...);
    bean.setPassword(...);
    bean.setResourceClass(ModelRestService.class);

    bean.getOutInterceptors().add( new org.apache.cxf.interceptor.LoggingOutInterceptor() );

    ModelRestService model = bean.create(ModelRestService.class);

    ModelCriteria mc = oFact.createModelCriteria();
    mc.setModelNumber("Test");

    FindModelResult fmResult = model.findByCriteria(mc);

剩下的@XmlRootElement错误是因为我没有完全限定REST端点/ services / v2 / rest。

3 个答案:

答案 0 :(得分:6)

假设您使用CXF,并且您已为服务端点BookStore

生成了一个类
BookStore store = JAXRSClientFactory.create("http://bookstore.com",
                                            BookStore.class);
Books books = store.getAllBooks();

有关详细信息,请参阅以下链接:

答案 1 :(得分:4)

如果您确实知道maven,您可以使用wadl2java maven插件,这是一种示例使用方法。

<plugin>
                        <groupId>org.apache.cxf</groupId>
                        <artifactId>cxf-wadl2java-plugin</artifactId>
                        <version>2.7.6</version>
                        <executions>
                            <execution>
                                <id>generate-sources</id>
                                <phase>generate-sources</phase>
                                <configuration>
                                    <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
                                    <wadlOptions>
                                        <wadlOption>
                                            <wadl>${basedir}/src/main/resources/wadl/kp.wadl</wadl>
                                            <impl>true</impl>
                                            <packagename>com.kp.webservices.service</packagename>
                                            <extraargs>
                                                <extraarg>-supportMultipleXmlReps</extraarg>
                                            </extraargs>
                                        </wadlOption>
                                    </wadlOptions>
                                </configuration>
                                <goals>
                                    <goal>wadl2java</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

答案 2 :(得分:2)

Apache CXF 可以做到。

在这里,您可以找到如何从 wadl 生成工件以及如何将它们用作客户端。

http://cxf.apache.org/docs/jaxrs-services-description.html