xsd模式不是由wsdl呈现的

时间:2012-06-13 11:13:04

标签: xsd wsdl jax-ws

我正在使用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>

依旧......

2 个答案:

答案 0 :(得分:5)

我几乎无法相信这是一个难以解决的问题!

我&#39;一直在google搜索拼了命的找到解决的正是这种问题!然后,我一直在努力寻找自己的解决方案。通过调试器 - 逐步执行java-6-openjdk的默认javax.xml.ws.spi.Provider实现(JRE中的&#34; factory&#34;创建javax.xml.ws.Endpoint对象)您用来发布Web服务)我终于学到了一些东西,这帮助我创建了一个至少在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)来获取未发布的端点。然后我将XSD文件添加为&#34;元数据&#34;到(仍然未发表的)端点(代码&#34; ep.setMetaData(...)&#34;)。 然后我发布了端点(代码&#34; ep.publish(...)&#34;)。

现在,当我访问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>

答案 1 :(得分:0)

好的,我们走了。

进入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中显示

    <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中展示

我希望能帮助你。侨