CXF可以将wsdls和xsd作为原始单独文件而不是一个大文件发布吗?

时间:2016-05-01 22:32:56

标签: cxf soapui

我使用WSDL和几个XSD文件(自上而下的方法)生成了一个CXF Web服务。

但是当我打开一个指向我的CXF webservice http://some-ip/path/WebServiceName?wsdl的浏览器时,它会返回一个大的WSDL文件(原始的XSD对象都包含在这个文件中)。

是否可以以单独的文件(使用<import>)而不是一个大文件发布原始WSDL和XSD文件的方式配置CXF?

使用大文件,我在SoapUI&#34;验证&#34;时收到以下错误: 预期的元素&some;#element @ someNamespace&#39;而不是'someElement @ someOtherNamespace&#39;在元素......

看起来命名空间在某种程度上是混合的(在CXF生成的WDSL或者#34;验证&#34; SoapUI的功能中)。

但问题仅在于CXF返回的WSDL(以&#39;?wsdl&#39;结尾的url),因为如果我从我的硬盘导入SoapUI原始WSDL和XSD,问题就不存在了。

1 个答案:

答案 0 :(得分:0)

如果您调用org.apache.cxf.jaxws.EndpointImpl.setWsdlLocation 通过类路径上的WSDL路径,该服务将发布一个导入了XML模式文件的WSDL。

示例,使用Spring注释:

@Configuration
public class ExampleWebServiceConfiguration {

    private static final String BASE_URL = "/*";
    private static final String SERVICE_NAME_LOCAL_PART = "ExampleService";
    private static final String SERVICE_NAME_NAMESPACE_URI = "http://www.example.org/webservices/1.0/ExampleService";

    protected ExampleServicePortType ExampleServicePortType;

    @Value("${ws.endpoint.address}")
    String wsEndpointAddress;

    @Autowired
    public ExampleWebServiceConfiguration(ExampleServicePortType ExampleServicePortType) {
        this.ExampleServicePortType = ExampleServicePortType;
    }

    @Bean
    public ServletRegistrationBean cxfServlet() {
        return new ServletRegistrationBean(new CXFServlet(), BASE_URL);
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), ExampleServicePortType);
        endpoint.setServiceName(new QName(SERVICE_NAME_NAMESPACE_URI, SERVICE_NAME_LOCAL_PART));
        endpoint.setWsdlLocation("/wsdl/exampleservices/ExampleService.wsdl");
        endpoint.publish(wsEndpointAddress);
        return endpoint;
    }
}