我在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文件
我是否应该更改任何配置或向web服务添加一些注释?
实际上,在运行时WSDL生成器中不可能使用inlineSchemas
。我调试了WSDL生成,并在Endpoint Factory
中发现了这一行,其中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);
// [...]
}
https://github.com/eclipse-ee4j/metro-jax-ws/blob/f37dae6bdfd03bafdad63ed05b27dbfc3c38af1b/jaxws-ri/rt/src/main/java/com/sun/xml/ws/server/EndpointFactory.java#L658
JAX-WS要改变这一点还有一个开放的问题(但我想JAX-WS中的改变已经没有多大希望了)。https://github.com/eclipse-ee4j/metro-jax-ws/issues/49
AFAIK不可能让JAX生成一个带有内联模式的WSDL。
顺便说一句:分离WSDL定义和XSD模式是一个很好的举措(您可能希望在不同的上下文中使用模式定义的对象结构,例如将数据存储到文件或类似的东西)。
这就是说:如果您需要一个“一体式”WSDL(因为一些古老的客户机需要它),您可以始终让jax-ws
最初生成WSDL,然后根据您的内心内容编辑它。可以使用@WebService
注释的wsdlLocation
参数包含编辑的WSDL。
您可以让JAX-WS通过使用
-inlineSchemas
命令行开关。[1]张志强
如果您在项目中使用Maven,您可以将JAX-WS Maven插件配置为对执行配置中的inlineSchemas配置元素执行相同的操作,如下所示:[2]
<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
我有 Windows Server 2012 R2上的WebSphere Liberty 17.0.0.1“base_ilan”x86_64 Windows 10 x86_64上的Eclipse Neon.3(同一LAN上的独立服务器) Oracle Java JDK 1.8.0_121running Liberty 运行Eclipse的IBM JDK 8(来自Eclipse包)(需要它来支持Wi
我有一个JAX-WS注释的Web服务,当我将其部署到WildFly 8.1.0 Final中时,我有如下内容: 当我想要这样的东西时: 因此,基本上,我希望WildFly/JAX-WS将一些类型放在一个单独的XSD模式文件中,而不是仅仅在WSDL文件中显示它们。 我可以通过一些注释或一些配置文件来执行此操作吗?
你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W
我需要调用WildFly 8上可用的JAX-WS Web服务。我从一个简单的例子开始。这是我的网络服务: WSDL 可在以下网址获得: http://localhost:8080/DemoWS/HelloWorld?wsdl 看看Tomcat-CXF的例子,我编写了以下路由: 通过在 Camel 上下文中运行上述代码,将返回以下错误: serviceClass=com.sample。HelloWo
如前一个StackOverflow问题所述,我正在学习如何使用JAX-WS(用于XML Web服务的Java API)。我在以前的可执行Java程序中使用过Log4j2,我想用它来记录web服务请求。在本JAX-WS教程中,如何将Log4j2添加到基本代码中?
问题内容: 去年,我通过此链接为Web服务制作了JAX- WS客户端 该Web 服务使用STS服务获取SAML令牌并使用它访问主要Web服务。我使用apache cxf的wsdl2java为该Web服务生成JAX-WS客户端。一切都很好。 最近,他们已更新其STS服务端点。这个新的STS服务端点。其中具有不同的签名和摘要算法。它在请求正文中有一些额外的元素。 我试图修改当前代码,以使其支持新的ST