【问题标题】:How to create a client app for a RESTful service from wadl?如何从 wadl 为 RESTful 服务创建客户端应用程序?
【发布时间】:2015-07-18 15:49:49
【问题描述】:

给定一个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

【问题讨论】:

    标签: rest spring-mvc cxf wadl


    【解决方案1】:

    这是我通过查看源代码的发现:

    作为SourceGenerator.java,wadltojava 正在尝试从“application”元素中获取“resources”元素,并希望它只有一个。

    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,似乎只有一个“资源”元素。

    进一步检查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 中手动将命名空间修改为最新的,然后重试。

    【讨论】:

    • 感谢您提供详细信息。很高兴知道。不确定使用什么框架来生成第 3 方 wadl。我用过 CXF_HOME\bin\wadl2java.bat
    • 如果您将 WADL 作为本地文件,请尝试手动将命名空间更改为 http://wadl.dev.java.net/2009/02,然后重试。如果您下载 WADL,那么您可能还需要下载语法 XSD,并将它们全部保存在同一位置/文件夹中。
    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多