【问题标题】:What is the entry point in a CXF generated web service?CXF 生成的 Web 服务的入口点是什么?
【发布时间】:2013-10-04 15:10:02
【问题描述】:

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

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

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

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

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

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

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

顺便说一句,我尝试从 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 似乎很好地隐藏了实现细节,但我想知道在哪里挂钩我的初始化自定义。

【问题讨论】:

    标签: jakarta-ee wsdl cxf wsdl2java contract-first


    【解决方案1】:

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

    对于简单的验证需求,CXF 确实支持schema validation via configuration

    如果您想在消息到达您的服务之前对其进行更有趣的处理,并从 CXF 的功能中受益,我建议您熟悉 CXF 拦截器。它们非常强大,可以在消息到达服务之前和退出服务之后的任意阶段拦截消息。 CXF 文档有details on the phases and instructions on writing an Interceptor

    【讨论】:

    • 感谢您提供出色的教育性答案。至于通过配置验证模式,因为我已经可以看到网络服务正在执行一些验证,我假设它默认是打开的,因此可能不需要<jaxws:endpoint。我对吗?但是,验证并未涵盖架构中指定的所有规则,因此我怀疑需要 cxf.xml。我的方向正确吗?
    • 好的,明白了(关于通过配置验证模式):事实证明,对cxf.xml 的引用有点令人困惑,因为他们真正指的是“应用程序上下文”XML 无论如何都必须存在,并且可以命名为 anything...我的命名为 beans.xml,我要做的就是启用模式验证添加 <jaxws:properties> <entry key="schema-validation-enabled" value="true" /> </jaxws:properties> 到已经定义<jaxws:endpoint 元素。现在一切都很好。
    猜你喜欢
    • 2012-11-02
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多