当前位置: 首页 > 知识库问答 >
问题:

wsdl不提供xsd模式

阙佐
2023-03-14

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

等等

共有2个答案

越俊艾
2023-03-14

好了,开始吧。

到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.

孟茂
2023-03-14

我简直不敢相信这是一个如此难解决的问题!

我一直在谷歌上疯狂地搜索,想找到解决这个问题的办法!然后我一直在努力寻找一个自己的解决方案。通过调试程序逐步通过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中,不生成任何文件。 欢迎提出建议。