【问题标题】:How to know when Spring/CXF is ready to take requests?如何知道 Spring/CXF 何时准备好接受请求?
【发布时间】:2016-09-17 05:42:22
【问题描述】:

我有一个使用 Apache CXF 和 JAX/RS 来实现 API 的 Java Web 应用程序。我们在 tomcat 下运行我们的 webapp。我需要在我的应用程序中实现一些调用外部服务的东西,这可能会再次调用我的应用程序。只有在 CXF 完成初始化并准备好接受外部 API 请求后,我才需要调用该外部服务。我已经检查了 servlet 上下文侦听器、CXFServlet、应用程序上下文刷新和其他内容,但看不到任何在过程中调用到足够晚的内容以使 CXF 开始接受请求。还是我需要触发来自 tomcat 的某些事件?

【问题讨论】:

    标签: java spring tomcat cxf


    【解决方案1】:

    如果您在 spring 配置中将 CXF 依赖项定义为 bean,它将在应用程序启动时加载并准备好。如您所知,spring bean 在应用程序启动期间被加载和解析,您还可以具有预初始化和初始化后功能,例如@PostConstruct。

    来自参考https://www.luckyryan.com/2013/06/15/apache-cxf-exception-handler-for-jaxrs-rest/ 的示例配置:

    <!-- rest container -->
    <jaxrs:server id="sampleSerivceREST" address="/rest">
        <jaxrs:serviceBeans>
            <ref bean="sampleServiceRESTGateway"/>
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
            <bean class="com.luckyryan.sample.service.ExceptionHandler"/>
        </jaxrs:providers>
    </jaxrs:server>
    
    <!-- soap container -->
    <jaxws:endpoint
            id="sampleServiceSOAP"
            implementor="#sampleServiceSOAPGateway"
            address="/soap"
            serviceName="sampleSoapService"/>
    

    【讨论】:

    • 嗯,对,我有。问题是,ApplicationContext 在其初始化周期的早期就实例化了所有 Spring bean。不幸的是,CXF 只能在很久以后才能接受请求。我确定有什么东西可以点击,我只是不确定它是什么。
    • 您是否为 CXF servlet 定义 1
    • 嗯,它是 3,但是是的。我不确定为什么要花这么长时间才能到达 CXF 响应请求的地步,但确实如此。这就是为什么我希望有一些我错过的秘密回调或事件。
    • 据我了解,您想检查 CXFServlet 是否已初始化。您可以使用此docs.oracle.com/javaee/6/api/javax/servlet/… 进行检查。
    • 同时保持启动顺序为 1,这样它会尽快初始化。
    猜你喜欢
    • 2023-01-28
    • 2019-09-01
    • 2023-03-21
    • 2012-10-19
    • 1970-01-01
    • 2011-07-21
    • 2017-07-06
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多