【发布时间】:2015-11-21 12:45:55
【问题描述】:
我想解析一个由 jersey 生成的 .wadl 文件。但我不知道 jersey 是如何生成 wadl 文件的,是否有 jersey 使用的方案文件。事实上,我想找到方案文件并使用 xmlBeans 来解析 wadl 文件。我想知道有没有其他方法可以做到这一点。我将不胜感激!
【问题讨论】:
标签: java xml xml-parsing jersey jersey-2.0
我想解析一个由 jersey 生成的 .wadl 文件。但我不知道 jersey 是如何生成 wadl 文件的,是否有 jersey 使用的方案文件。事实上,我想找到方案文件并使用 xmlBeans 来解析 wadl 文件。我想知道有没有其他方法可以做到这一点。我将不胜感激!
【问题讨论】:
标签: java xml xml-parsing jersey jersey-2.0
最简单的方法是查看resource class that generated the wadl response。您会看到model class it uses as the representation 就是com.sun.research.ws.wadl.Application,它是一个JAXB 生成的类。如果您查看containing package,您将看到构成完整 wadl 模型的所有其他模型类。
因此,由于这些是 JAXB 类,您可以使用 JAXB 来解组响应,使用 Application 类作为根模型类型。
如果您使用的是 Jersey 客户端,则可以直接从 Response 解组到 Application
Response response = target("application.wadl").request("application/xml").get();
Application wadlApp = response.readEntity(Application.class);
或者如果你得到一个String或InputStream其他方式,你可以直接使用JAXB来解组
String wadlString = ...
JAXBContext context = JAXBContext.newInstance(Application.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Application wadlApp = (Application)unmarshaller.unmarshal(new StringReader(wadlString));
这种方法的问题是类包含在jersey-server 工件中。无论您在做什么,您都可能不希望这种负载。
您也可以尝试使用 xjc 自己生成 JAXB 类,与 wadl.xsd Jersey 一起使用。我想你会得到类似的,如果不是泽西使用的模型类。这样你就不需要依赖jersey-server。
所以我刚刚测试了 xjc 来生成 JAXB 类,使用上面的 wadl.xml,它可以工作。它产生与 Jersey 相同的类
// maven directory structure (src/main/java)
xjc -d src/main/java -p com.stackoverflow.jersey.wadl.test wadl.xsd
然后您可以使用上面的 JAXB 示例来解组使用生成的类。
【讨论】: