我使用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,问题就不存在了。
答案 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;
}
}