我在java上为tomcat应用服务器编写了一个简单的JAX-WS Web服务。
我有一个接口和实现类:
接口
@WebService(name = "myWs")
@SOAPBinding(style = Style.RPC)
public interface IMyWs {
@WebMethod(operationName = "getUser")
Response getUser(@WebParam(name = "phone", mode = Mode.IN) String phone);
}
实施
@WebService(endpointInterface = "ge.mari.IMyWs")
public class MyWs implements IMyWs {
@Override
public Response getUser(String phone) {
// SOME CODE
return response;
}
}
我的问题是,在我的wsdl文件中,响应类是在xsd文件中定义的。
这是我的wsdl文件的片段
<types>
<xsd:schema>
<xsd:import namespace="http://ws.mari.ge/" schemaLocation="http://localhost:8080/MyServcie/MyWs?xsd=1">
</xsd:import>
</xsd:schema>
</types>
如何使Web服务生成WSDL文件中的所有类型而不是单独的XSD文件?
我应该更改任何配置或添加一些注释到我的网站服务吗?
答案 0 :(得分:9)
您可以使用
让JAX-WS将生成的模式插入到WSDL文件中-inlineSchemas
命令行开关。 [1]
如果您在项目中使用Maven,则可以配置JAX-WS maven插件,以便在执行配置中对 inlineSchemas 配置元素执行相同操作,如下所示:[2] < / p>
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>SomeId</id>
<goals>
<goal>wsgen</goal>
</goals>
<phase>prepare-package</phase>
<configuration>
<sei>some.class.Name</sei>
<genWsdl>true</genWsdl>
<keep>true</keep>
<resourceDestDir>some/target/dir</resourceDestDir>
<inlineSchemas>true</inlineSchemas>
</configuration>
</execution>
</executions>
</plugin>
不需要对Java类进行任何更改。
[1] http://jax-ws.java.net/nonav/2.2.1/docs/wsgen.html
[2] http://jax-ws-commons.java.net/jaxws-maven-plugin/wsgen-mojo.html
答案 1 :(得分:0)
AFAIK不可能让JAX生成带有内联架构的WSDL。
BTW:分离WSDL定义和XSD架构是一个很好的举措(您可能希望在不同的上下文中使用模式定义的对象结构,例如将数据存储到文件或类似的东西)。
那说:如果你需要一个“一体化”WSDL(因为一些古老的客户端需要它)你最初可以jax-ws
生成WSDL,然后将其编辑为你的心的内容。可以使用wsdlLocation
注释的@WebService
参数包含已编辑的WSDL。
答案 2 :(得分:0)
在运行时WSDL生成器中实际上{strong>不能使用inlineSchemas
。我调试了WSDL的生成,并在EndpointFactory
中找到了这一行,其中inlineSchemas
功能(实际上在wsgen
工具中存在 )设置为false
:
/**
* Generates the WSDL and XML Schema for the endpoint if necessary
* It generates WSDL only for SOAP1.1, and for XSOAP1.2 bindings
*/
private static SDDocumentImpl generateWSDL(WSBinding binding, AbstractSEIModelImpl seiModel, Collection<SDDocumentImpl> docs,
Container container, Class implType) {
// [...]
WSDLGenInfo wsdlGenInfo = new WSDLGenInfo();
// [...]
wsdlGenInfo.setInlineSchemas(false);
// [...]
seiModel.getDatabinding().generateWSDL(wsdlGenInfo);
// [...]
}
JAX-WS对此进行更改还有一个未解决的问题(但我想JAX-WS更改的希望不大了)。 https://github.com/eclipse-ee4j/metro-jax-ws/issues/49