我正在使用JAX-WS开发WebService(我在jaxws maven插件上使用wsimport目标)。我编写了一个导入XSD模式的WSDL。
WEB-INF/wsdl/service.wsdl
WEB-INF/wsdl/service.xsd
此外,我还生成了web服务类,并创建了endpoint和all。到目前为止,一切都很顺利。当我在Tomcat7上运行服务时,一切都正常。我可以从以下位置访问浏览器中的wsdl:
http://localhost:8080/webService/servlet-url?wsdl
但是我无法访问xsd模式。问题是在这个wsdl:
<xsd:schema>
<xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="service.xsd"/>
</xsd:schema>
当然,在生成类的过程中,wsdl和xsd位于本地路径上,但我希望它们在web服务运行时可以远程访问。我知道schemaLocation应该是这样的“http://localhost:8080/webService/servlet-网址?xsd=1”。
在浏览器中显示的wsdl中,导入命令如下所示:
<xsd:schema>
<xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="http://localhost:8080/webService/servlet-url?wsdl&resource=service.xsd"/>
</xsd:schema>
localhost:8080/webService/servlet?wsdl给了我:
wsdl:definitions targetNamespace="http://ws.serv.com/Service/1.0" name="emuiaService">
<wsdl:types>
<xsd:schema>
<xsd:import namespace="http://ws.serv.com/Service/domain/1.0" schemaLocation="schema.xsd"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="halloMsg">
<wsdl:part name="parameters" element="dom:halloRequest"/>
</wsdl:message>
<wsdl:message name="halloResponseMsg">
<wsdl:part name="return" element="dom:halloResponse"/>
</wsdl:message>
等等
好了,开始吧。
到WSDL文件中,以修改如下内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wsdl:definitions
targetNamespace="http://service.wsr.company.com/"
name="webServiceExample"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://servicio.wsr.baz.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
在这个小片段中,xmlns标记非常重要。这些用于部署模式XSD。下一个
<wsdl:types>
<xs:schema
xmlns:tns="http://service.wsr.company.com/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://service.wsr.company.com/" version="1.0">
...
</xs:schema>
</wsdl:types>
进入下面的标签,您将获得服务中的内容。xsd
文件或在http://localhost:8080/webService/servlet-网址?xsd=1
我们继续
<wsdl:message name="your_method_name">
<wsdl:part name="parameters" element="tns:your_method_name"/>
</wsdl:message>
<wsdl:message name="your_method_nameResponse">
<wsdl:part name="parameters" element="tns:your_method_nameResponse"/>
</wsdl:message>
上面的标签显示了您的方法名称。下一个
<wsdl:portType name="webServiceExample">
<wsdl:operation name="your_method_name">
<wsdl:input message="tns:your_method_name"/>
<wsdl:output message="tns:your_method_nameResponse"/>
</wsdl:operation>
</wsdl:portType>
高于焦油含量的是为你的手术准备的。继续吗
<wsdl:binding name="webServiceExamplePortBinding" type="tns:webServiceExample">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:operation name="your_method_name">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
下一个:)
<wsdl:service name="webServiceExample">
<wsdl:port name="webServiceExamplePort" binding="tns:webServiceExamplePortBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</wsdl:port>
最后完成:)
请注意,您必须逐个标记更改当前标记
您可以保存它,并在WSDL中显示XSD模式。
我希望能帮到你。Ciao.
我简直不敢相信这是一个如此难解决的问题!
我一直在谷歌上疯狂地搜索,想找到解决这个问题的办法!然后我一直在努力寻找一个自己的解决方案。通过调试程序逐步通过java-6-openjdk的默认javax。xml。ws。spi。提供者实现(JRE中的“工厂”,用于创建用于发布web服务的javax.xml.ws.Endpoint对象)我终于学到了一些东西,这帮助我制定了一个至少在Java SE中工作的解决方案,至少在我当前的JRE中是这样的:
java version "1.6.0_33"
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.12.04)
OpenJDK Server VM (build 23.25-b01, mixed mode)
这个解决方案在JavaEE中是否可用,我还不知道。
我是这样解决的:
package myservice;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Endpoint;
public class App
{
private static final String MY_SERVICE_XSD = "/wsdl/MyService.xsd";
public static void main( String[] args )
{
Endpoint ep = Endpoint.create(new MyEndpointImpl());
ep.setMetadata(Arrays.asList(sourceFromResource(MY_SERVICE_XSD)));
ep.publish("http://localhost:8080/svc/hello");
}
private static Source sourceFromResource(String name) {
URL resource = App.class.getResource(name);
String systemId = resource.toExternalForm();
InputStream inputStream;
try {
inputStream = resource.openStream();
} catch (IOException e) {
throw new RuntimeException("Failed to create InputStream from resource \""+ name +"\"", e);
}
return new StreamSource(inputStream, systemId);
}
}
关键的是,我首先使用方法Endpoint#create(而不是Endpoint#publish)来获取未发布的endpoint。然后,我将XSD文件作为“元数据”添加到(尚未发布的)endpoint(代码“ep.setMetaData(…)”)。然后我发布endpoint(代码“ep.publish(…)”)。
现在当我访问http://localhost:8080/svc/hello?wsdl
我得到:
<definitions targetNamespace="http://somewhere.net/my/namespace" name="MyService">
<types>
<xsd:schema>
<xsd:import namespace="http://somewhere.net/my/namespace"
schemaLocation="http://localhost:8080/svc/hello?xsd=1"/>
</xsd:schema>
</types>
...
</definitions>
我的XSD文件可以从http://localhost:8080/svc/hello?xsd=1
!
请注意,我的MyService。磁盘上的wsdl文件仍然包含:
<xsd:schema>
<xsd:import namespace="http://somewhere.net/my/namespace"
schemaLocation="MyService.xsd"></xsd:import>
</xsd:schema>
我有一个JAX-WS注释的Web服务,当我将其部署到WildFly 8.1.0 Final中时,我有如下内容: 当我想要这样的东西时: 因此,基本上,我希望WildFly/JAX-WS将一些类型放在一个单独的XSD模式文件中,而不是仅仅在WSDL文件中显示它们。 我可以通过一些注释或一些配置文件来执行此操作吗?
有没有什么方法可以从wsdl生成xsd。任何链接或工具也可以。最简单的方法是什么?
首选框架是Spring Web Service,但也欢迎其他解决方案。 问候,
我尝试使用avro-python3(向后兼容性)重新创建一个模式演变案例。 我有两个模式: 第二个模式没有字段,但有两个附加字段:和。 根据avro模式演化规则,如果我用schema_v1写入avro记录: …我可以使用schema_v2读取它,前提是不存在字段有默认值 但我得到了以下错误: 我知道这在Java中有效。这是一个视频课程的示例。有没有办法让它在python中工作?
问题内容: 我有一个模块,其中有我的XSD模式,其中一个模式可以使用模式位置内的相对路径引用另一个模式: 在这里,我还使用xjc从这些xsd模式生成Jaxb bean。 现在,我有了一个使用spring-ws(2.0.4)实现我的Web服务的模块。我想使用 静态WSDL 并将其与xsd模式一起发布,其中模式位置将转换为URL,例如“ http://myerver.url.com/my.xsd”。
使用: 所有类都在中生成,在中没有类。没有-p开关,所有xsd都是在它们自己的默认包中生成的。但无法告诉wsimport为每个XSD使用特定的包。现在我使用以下绑定文件,这可能是不正确的,但wsimport对此没有抱怨: 在包org.broker.wsi.b_2和org.broker.wsi.t_1中,不生成任何文件。 欢迎提出建议。