jer*_*own 4 spring tomcat servlets cxf spring-boot
我试图用弹簧启动来构建一个嵌入式Tomcat.我想在应用程序中使用CXF作为一组Web服务,但我无法弄清楚如何站起来使用CXF servlet.
我的主要课程看起来像这样......
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的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/*");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用典型命令构建并启动jar时 ./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.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)
Run Code Online (Sandbox Code Playgroud)
这是一个更完整的pastebin - http://pastebin.com/bcJ2ULhM
与Dave的回答类似,我可以通过删除ServletContextInitializer并将bean添加到Application Class来解决它.
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new CXFServlet(),"/api/*");
}
Run Code Online (Sandbox Code Playgroud)
春季启动嵌入式servlet的功能设计工作,并具Servlet和ServletRegistration @Beans,而不是与ContextLoaderListener(这看起来是试图窃取ServletContext根上下文属性).尝试ServletRegistration为您的servlet 添加一个; 如果它是Spring知道的,假设它有一个允许你更改应用程序上下文或上下文位置的接口,那么你应该能够在注册中配置它.
| 归档时间: |
|
| 查看次数: |
6579 次 |
| 最近记录: |