我们正在开发一个包含几十个服务接口的大型应用程序。对于每个服务,都使用wsgen(使用jaxws-maven-plugin maven插件)生成wsdl。对于每个服务,wsdl中使用不同的命名空间。
服务接口共享一组公共bean(主要是dto)。现在,这些通用类的定义是在每个wsdl的XSD中定义的,重复了很多信息,这给我们在客户端带来了问题(巨大的编译时间,类不兼容)。
首先,我尝试用schemagen为常见类创建一个模式,但无法将其传递给wsgen。是否有一种方法可以将一个(或多个)通用XSD传递到wsgen,并让生成的wsdl引用这些XSD ?
我还尝试用@XmlRootElement指定一个自定义名称空间来注释公共类:这次wsgen识别了自定义名称空间,并为每个wsdl生成了一个XSD,但没有在每个地方都包含一个(公共)XSD。
有人能给我指出解决这个问题的方法吗?
你和我有很多共同点。:)
我们做了很多类似的事情:我们在整个应用程序中使用WSDL-first web服务和dto。然而,我们用XML模式定义dto,以便我们可以向它们添加元数据,从而通过JAXB插件将代码添加到生成的Java中。我们打算在web服务中使用这些基于xsd的dto,但是根据公司标准,我们被迫在web服务中使用一些通用的公司xsd。这不会有什么不同——我们可以很容易地使用我们的DTO xsd。
关于你们的问题,我们有你们没有的dto的xsd。如果您这样做了,那么您唯一需要做的事情(假设是一个Maven多模块项目)就是如何跨模块解析模式。我们通过分叉jaxws maven插件并向其添加一个基于classpath的目录模式解析器来实现这一点。我想让你为你的dto创建模式是不可能的?除此之外我也帮不上什么忙,因为我从未使用过jaxb注释。对不起。
我也遇到过类似的问题。
我将下面的注释添加到公共类中,这样它们就不会为每个wsgen生成多次。
@XmlType(namespace = "http://mypackage.mycompany.com/")
public MyClass implements Serializable {
// ... class contents
}