如何拦截CXF中的WSDL请求?

时间:2013-01-25 16:37:56

标签: java soap wsdl cxf

背景故事:

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

由于这是由导入完成的,因此顶级WSDL并不是那么大。 WSDL2Java和wsimport阻塞它,但我有一个编译到JAXB对象中的模式库来使用。所以我创建了一个具有所有必需操作的CXF服务,并且我能够使用SoapUI对其进行测试(它导入了顶级WSDL,因为它不需要创建java类)。

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

问题:

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

问题:

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

1 个答案:

答案 0 :(得分: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的更多信息。