xsd模式不由wsdl提供
我用JAX-WS开发WebService(我在jaxws-maven-plugin上使用wsimport目标)。 我编写了一个导入XSD模式的WSDL。
WEB-INF/wsdl/service.wsdl
WEB-INF/wsdl/service.xsd
我还生成了Web服务类并创建了端点和全部。 到目前为止,一切都很好。 当我在Tomcat 7上运行我的服务时,一切都很好。 我可以从我的浏览器访问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-url?xsd = 1”。
在浏览器导入的wsdl中,schould看起来像:
<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>
等等...
我几乎不能相信这是一个难以解决的难题!
我一直在疯狂地谷歌搜索这个问题的解决方案! 然后,我一直在努力寻找自己的解决方案。 通过调试器遍历java-6-openjdk的默认javax.xml.ws.spi.Provider实现(JRE中的“工厂”,它创建用于发布Web服务的javax.xml.ws.Endpoint对象)I终于学到了一些东西,这些东西帮助我创建了一个至少可以在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)
此解决方案在Java EE中是否可用我还不知道。
这是我如何解决它的:
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文件作为“元数据”添加到(仍未发布的)端点(代码“ep.setMetaData(...)”)。 然后我发布端点(代码“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>
好的,我们走吧。
进入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>
在下面的标签中,您将获得您在service.xsd
文件中的所有内容,或者在http://localhost:8080/webService/servlet-url?xsd=1
显示它http://localhost:8080/webService/servlet-url?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:...></wsdl:...>
更改当前标记
您保存它,公众和您玩得开心XSD架构在WSDL中呈现 。
我希望能帮助你。 再见。
链接地址: http://www.djcxy.com/p/60601.html