如何从wadl为RESTful服务创建客户端应用程序?

时间:2015-07-18 15:49:49

标签: rest spring-mvc cxf wadl

给定application.wadl文件,如何从wadl文件生成客户端应用程序(Spring或任何)和域对象?

我试过了:

wadl2java https://genologics.com/files/permanent/API/2.5/application.wadl
WADLToJava Error: java.lang.IllegalStateException: Single WADL resources element is expected

1 个答案:

答案 0 :(得分:1)

这是我通过审查源代码的结果:

作为SourceGenerator.java,wadltojava正试图获得"资源"来自"应用程序的元素"元素,并期望它只是一个。

private void generateResourceClasses(Application app, GrammarInfo gInfo, 
                                         Set<String> typeClassNames, File src) {
        Element appElement = app.getAppElement();
        List<Element> resourcesEls = getWadlElements(appElement, "resources");
        if (resourcesEls.size() != 1) {
            throw new IllegalStateException("Single WADL resources element is expected");
        }

        List<Element> resourceEls = getWadlElements(resourcesEls.get(0), "resource");
        if (resourceEls.size() == 0) {
            throw new IllegalStateException("WADL has no resource elements");
        }
        ........
   }

我检查了你提供的WADL,似乎只有一个&#34;资源&#34;元件。

getWadlElements()方法中进一步检查时正在使用getWadlNamespace()

private List<Element> getWadlElements(Element parent, String name) {
        List<Element> elements = parent != null 
            ? DOMUtils.getChildrenWithName(parent, getWadlNamespace(), name)
            : CastUtils.cast(Collections.emptyList(), Element.class);
        if (!"resource".equals(name)) {    
            for (int i = 0; i < elements.size(); i++) {
                Element el = elements.get(i);
                Element realEl = getWadlElement(el);
                if (el != realEl) {
                    elements.set(i, realEl);
                }
            }
        }
        return elements;
    }

WadlGenerator.java中使用的命名空间是

public static final String WADL_NS = "http://wadl.dev.java.net/2009/02";

但是在你的WADL中,名称空间似乎与下面不同,可能会导致问题。

<wadl:application xmlns:wadl="http://research.sun.com/wadl/2006/10" xmlns:xs="http://www.w3.org/2001/XMLSchema">

根据我的理解,您似乎正在使用CXF,我建议您使用相同的框架来生成WADL。

更新: 或者,在本地使用WADL和XSD,并在WADL中手动修改命名空间,然后重试。