0

使用契约优先的方法,我使用 CXF 从 WSDL 生成了一个 Web 服务。

Tomcat 7 可以很好地加载 Web 服务并正确响应 SOAP 消息。

但是,虽然我了解 WSDL 和 XSD 中自动生成的 Java 类,但我不确定我是否知道入口点在哪里(例如,我可以启用验证)。

由于熟悉的 main() 方法只是一个默认入口点并且不是强制的,因此我假设 CXF 为此目的使用了不同的入口点。

当我构建 Web 服务(使用包含 CXF 插件的 pom.xml)时,只生成了 2 个包(足以建立一个工作的Web 服务):

  1. 一个用于 WSDL 本身,仅包含 3 个 Java 模块:ObjectFactory.java、MyBinding.java、MyService.java
  2. 第二个是针对 XSD 模式的,它为模式中定义的每个类型都包含一个 Java 类。

我怀疑扩展了一个名为的类的 MyService.javaService是我应该寻找该入口点的地方。但它是如何发挥“魔力”的呢?

顺便说一句,我尝试从 Tomcat 控制台解决这个问题,但这就是启动时的所有 Web 服务日志:

Oct 4, 2013 11:27:47 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started

Oct 4, 2013 11:27:47 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Fri Oct 04 11:27:47 EDT 2013]; root of context hierarchy

Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [beans.xml]

Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf.xml]

Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf-extension-soap.xml]

Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [META-INF/cxf/cxf-servlet.xml]

Oct 4, 2013 11:27:47 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@17392df: defining beans [org.springframework.context.
annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.anno
tation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,cxf,org.apache.cxf.bus.spring.BusWiringBeanF
actoryPostProcessor,org.apache.cxf.bus.spring.Jsr250BeanPostProcessor,org.apache.cxf.bus.spring.BusExtensionPostProcessor,org.apache.cxf.binding.soap.SoapBindin
gFactory,org.apache.cxf.binding.soap.SoapTransportFactory,org.apache.cxf.binding.soap.customEditorConfigurer,myserviceWS,myserviceBinding]; root of factor
y hierarchy

Oct 4, 2013 11:27:47 AM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
INFO: Creating Service {http://myws.example.com/ns}MyService from WSDL: file:/C:/Users/Daniel/myws/src/main/wsdl/myws.wsdl

Oct 4, 2013 11:27:48 AM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be /myservice/soap

Oct 4, 2013 11:27:48 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 1107 ms

CXF 似乎很好地隐藏了实现细节,但我想知道在哪里挂钩我的初始化自定义。

4

1 回答 1

2

CXFServlet 通常是您的服务的入口点。Tomcat 将 HTTP 请求路由到您的 webapp,并且 servlet-mapping 定义了接收请求的 Servlet。如果你想在请求到达 CXF 之前拦截它,你可以编写一个 Servlet Filter

对于简单的验证需求,CXF 确实支持通过配置进行模式验证

如果您想在消息到达您的服务之前对其进行更有趣的处理,并从 CXF 的功能中受益,我建议您熟悉 CXF 拦截器。它们非常强大,可以在消息到达服务之前和退出服务之后的任意阶段拦截消息。CXF 文档详细介绍了编写 Interceptor 的各个阶段和说明

于 2013-10-04T21:48:26.483 回答