带有tomcat和cxf-servlet的spring-boot

Posted

技术标签:

【中文标题】带有tomcat和cxf-servlet的spring-boot【英文标题】:spring-boot with tomcat and cxf-servlet 【发布时间】:2014-07-23 00:24:22 【问题描述】:

我正在尝试使用 spring-boot 支持嵌入式 Tomcat。我想将 CXF 用于应用程序中的一组 Web 服务,但我不知道如何支持 CXF servlet。

我的 Main 类看起来像这样......

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages="com.connecture.services.documentservice.webservice")
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(new Class[]  Application.class, CfxInitializer.class , args);
    
    
    @Bean
  public EmbeddedServletContainerFactory embeddedServletContainerFactory() 
      TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory("", 8080);
      return factory;
  


而我的 CfxInitializer 是这样的......

public class CfxInitializer implements ServletContextInitializer


  @Override
  public void onStartup(ServletContext servletContext) throws ServletException
  
    XmlWebApplicationContext rootContext = new XmlWebApplicationContext();  
    rootContext.setConfigLocations(new String[]  "classpath*:applicationContext.xml" );  
    servletContext.addListener(new ContextLoaderListener(rootContext));  

    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("CXFServlet", CXFServlet.class);  
    dispatcher.addMapping("/api/*");  
  


当我尝试使用典型命令 ./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar 构建和启动 jar 时

我得到了多个上下文的异常。

Java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:277)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4971)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

这是一个更完整的 pastebin - http://pastebin.com/bcJ2ULhM

---------------------------------------------- ----------------------------------

与 Dave 的回答类似,我能够通过删除 ServletContextInitializer 并将 bean 添加到应用程序类来修复它。

@Bean
  public ServletRegistrationBean servletRegistrationBean()
      return new ServletRegistrationBean(new CXFServlet(),"/api/*");
  

【问题讨论】:

1000 次观看和一票赞成。哎哟!至少给戴夫一些道具。 【参考方案1】:

Spring Boot 嵌入式 servlet 功能旨在与 ServletServletRegistration @Beans 一起使用,而不是与 ContextLoaderListener 一起使用(看起来它试图窃取根上下文的 ServletContext 属性)。尝试为您的 servlet 添加ServletRegistration;如果它是 Spring 感知的,假设它有一个允许您更改应用程序上下文或上下文位置的接口,那么您应该能够在注册时对其进行配置。

【讨论】:

【参考方案2】:

我在 github 上找到了以下项目,它帮助我开始了

https://github.com/ungerts/spring-boot-jaxrs-sample

为我工作过:

spring-boot 1.2.3 cxf-rt-frontend-jaxrs:3.1.0 jackson-jaxrs-json-provider:2.5.3

【讨论】:

【参考方案3】:

样本现在是 CXF wiki 的一部分:http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServicesConfiguration-SpringBoot

【讨论】:

不要将链接发布为答案,而是添加一些文本来解释此答案如何帮助 OP 解决当前问题。谢谢 好吧,只需将自己的代码替换为 wiki 中示例中更简单的代码即可...

以上是关于带有tomcat和cxf-servlet的spring-boot的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 揭秘与实战 服务器篇 - 其他内嵌服务器 发表于 2017-01-03 | Spring框架 | Spri

spring boot 嵌入式 tomcat 不以 jcifs smb 库开头

Tomcat - 上下文初始化失败

如何配置tomcat数据源?

Spring boot:无法启动嵌入式 Tomcat servlet 容器

带有 Eclipse 和 Tomcat 的 JSF 2.0 教程 [关闭]