2

背景故事:

我有一个由客户(不可协商)创建的 WSDL,它将多个 Web 标准混合到一个服务中。这一soap 服务有四个soap 端口,它们引用引用的(wsdl:import) WSDL 文件中的绑定,这些文件导入XSD,从而导致依赖关系树非常复杂。

由于这是通过导入完成的,因此顶级 WSDL 并没有那么大。WSDL2Java 和 wsimport 窒息它,但我有一个模式库编译成 JAXB 对象来使用。因此,我创建了一个包含所有必需操作的 CXF 服务,并且能够使用 SoapUI 对其进行测试(它很好地导入了顶级 WSDL,因为它不必创建 java 类)。

由于所有的soap 端口都指向同一个地址,并且该服务处理来自各个端口的所有操作,因此客户端不知道服务器认为所有操作都属于同一个端口。

问题:

当涉及到 CXF 生成 WSDL 时,这种情况就会崩溃。它将所有操作放在一个具有相同命名空间的端口上。在客户提供的 WSDL 中,服务、端口和绑定并不都在同一个名称空间中。我尝试使用 @WebService(wsdlLocation="") 注释为服务提供 WSDL,但它尝试解析它并将其与代码匹配(就像在理智的世界中一样)。

问题:

我想拦截/覆盖http://example.com/service?wsdl操作并返回客户提供的 wsdl。有没有办法在 CXF 中做到这一点?

4

1 回答 1

2

我最终将端口拆分为单独的服务,但我仍然需要一个包含所有端口信息的自定义 WSDL。使用 CXF 执行此操作的方法是创建一个拦截器。

我遵循了定期处理 WSDL 生成的 CXF 拦截器的示例:http: //grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-rt-frontend-simple/2.4.0/ org/apache/cxf/frontend/WSDLGetInterceptor.java。我阅读了我的自定义 WSDL,并将占位符主机名替换为来自请求 URL 的主机名。

然后,您需要在制作服务时添加自定义拦截器(我使用 spring 进行配置)。更多信息请访问http://cxf.apache.org/docs/interceptors.html

于 2013-01-29T15:47:08.487 回答