WADL /使用Jersey以合同为先的方式生成XSD
我一直在使用Jersey进行REST Web服务工作几天,并设法使所有的CRUD操作工作,有几种交换格式:XML,JSON,Google Protobuf。
不过,我正面临一些与自动生成的WADL和XSD有关的问题。
上下文
为了定义以这三种格式交换的对象,我遵循了“合同优先”的方法 :
- 从我写的XSD中,我使用JAXB生成了我的模型类;
- 从我写的一个等价的原始文件中,我生成了Google Protobuf类(并且在内部有一种将这些类转换为JAXB生成的对象的方法,以便拥有一个独特的模型)。
但是,因为我希望我的用户也能够生成他们的类 ,所以我想共享这些模式文件(.xsd和.proto),并将它们与自动生成的WADL很好地集成在一起 。
为此,感谢这个 wiki页面:
- 我已经暴露了两个文件下
/schema/schema.xsd
-
/schema/schema.proto
-
我已经添加了一个应用程序语法文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <grammars xmlns="http://wadl.dev.java.net/2009/02" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xi="http://www.w3.org/1999/XML/xinclude"> <include href="../schema/schema.xsd" /> </grammars>
-
我已经添加了一个定制的WADL生成器:
public class RichWadlGeneratorConfig extends WadlGeneratorConfig { @Override public List<WadlGeneratorDescription> configure() { return generator(WadlGeneratorApplicationDoc.class) .prop("applicationDocsStream", "application-doc.xml") .generator(WadlGeneratorGrammarsSupport.class) .prop("grammarsStream", "application-grammars.xml") .descriptions(); } }
这样下面出现在WADL中,当我打到/rest/application.wadl
:
<grammars> <include href="../schema/schema.xsd"/> <include href="application.wadl/xsd0.xsd"> <doc title="Generated" xml:lang="en"/> </include> </grammars>
问题
/rest/application.wadl/xsd0.xsd
是从我的类自动生成的,但是与我最初在schema.xsd
所做的完全不同 。 除此之外,在这个WADL上调用像wadl2java
这样的工具可能会失败,大概是因为
-
/schema/schema.xsd
和 -
/rest/application.wadl/xsd0.xsd
现在是冲突的(两个相同对象的定义)。
问题
-
有没有办法禁用这种自动生成的XSD的生成和扩散? (因为我遵循这种“契约优先”的方法,所以我不需要它)
-
如果没有,当
/rest/application.wadl/xsd0.xsd
命中时,是否有方法用我手动编写的XSD“覆盖”它的内容? (我search了一下,发现了WadlResource,生成定制的WADL,但没有发现任何关于XSD生成本身)
在此先感谢您的帮助!
M.
编辑
1)我向泽西队提出了这个问题,并得到了答复: http : //java.net/projects/jersey/lists/users/archive/2012-06/message/8
2)根据Pavel的指示,我提了一张票(JERSEY-1230)。 我目前正在跟进,或者自己提交一个修复程序,或者从泽西团队获得修复。
1.14-SNAPSHOT应该允许你这样做:
public class SampleWadlGeneratorConfig extends WadlGeneratorConfig { @Override public List<WadlGeneratorDescription> configure() { return generator( WadlGeneratorApplicationDoc.class ) .prop( "applicationDocsStream", "application-doc.xml" ) .generator( WadlGeneratorGrammarsSupport.class ) .prop( "grammarsStream", "application-grammars.xml" ) .prop("overrideGrammars", true) // !!! .generator( WadlGeneratorResourceDocSupport.class ) .prop( "resourceDocStream", "resourcedoc.xml" ) .descriptions(); } }
当overrideGrammars设置为true时,Jersey生成的语法将不会包含在返回的WADL中。
- 为什么在将客户端JBoss连接回收到远程队列之后仍然抛出SpyJMSExceptionexception?
- 获取在Windows Server 2008 R2上运行的MSDN PeerChannel“SecureChat”