如何为来自 wadl 的 RESTful 服务创建客户端应用程序?
How to create a client app for a RESTful service from 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
这是我查看源代码后的发现:
与 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,似乎只有一个 "resources" 元素。
进一步检查 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 中手动修改命名空间为最新的,然后重试。
给定一个 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
这是我查看源代码后的发现:
与 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,似乎只有一个 "resources" 元素。
进一步检查 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 中手动修改命名空间为最新的,然后重试。