5

I created a FAQ using spring boot. it needs to be deployed to a tomcat 6 server (servlet 2.5). I need to configure the current parent java app(war) web.xml to point all request to url pattern "/faq/*" for example, to my spring boot FAQ app. I've copied the FAQ.jar file into the lib folder of the parent app. But I'm not sure how to configure/register the spring boot servlet and servlet mapping within the web.xml of the parent application.

Using the spring boot legacy sample.. I placed my spring boot app in the parent app lib folder along with the dependency jar files. I added this code block to the web.xml of the parent app.

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>faq.Application</param-value>
 </context-param>

  <listener>
      <listener-class>
          org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener
      </listener-class>
  </listener>

  <filter>
      <filter-name>metricFilter</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

<filter-mapping>
    <filter-name>metricFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>SpringServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextAttribute</param-name>
        <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>SpringServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

But when I start up Tomcat, I get the following error.

Jun 30, 2014 12:17:23 AM org.apache.catalina.core.StandardContext listenerStart SEVERE: Exception sending context initialized event to listener instance of class org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener java.lang.IllegalAccessError: tried to access method org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/List; from class org.springframework.boot.SpringApplication at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:355) at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:346) at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:222) at org.springframework.boot.SpringApplication.(SpringApplication.java:198) at org.springframework.boot.builder.SpringApplicationBuilder.(SpringApplicationBuilder.java:83) at org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener.initWebApplicationContext(SpringBootContextLoaderListener.java:48) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:897) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:873) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095) at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Jun 30, 2014 12:17:23 AM org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart

KevyKev

user3780135
  • 91
  • 2
  • 7

1 Answers1

1

Spring Boot doesn't support Servlet 2.5 officially, but it doesn't take a lot to make it work. You might find this useful: https://github.com/scratches/spring-boot-legacy. Sample here: https://github.com/scratches/spring-boot-sample-gae.

Dave Syer
  • 56,583
  • 10
  • 155
  • 143
  • Thanks for responding... Using the spring boot legacy example, changes to the parent app's web.xml file and placed my boot app in lib folder. But when I start up Tomcat, I get the following error: SEVERE: Exception sending context initialized event to listener instance of class org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener java.lang.IllegalAccessError: tried to access method org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/List; from class org.springframework.boot.SpringApplication – user3780135 Jun 30 '14 at 14:16
  • Looks like a class path issue maybe? Check your WEB-INF/lib and any shared libraries in th container for old versions. Or do you have a `SecurityManager in your container? – Dave Syer Jun 30 '14 at 15:56
  • So I have to add every dependency jar of my spring boot app(FAQ.jar), into the lib folder of the parent app also? along with the app itself? – user3780135 Jun 30 '14 at 21:29
  • I don't really know what you mean by "parent app" but a war is self contained, so anything that needs to be on the classpath for your app has to be in there. Are you not using a dependency management system with your build tool (maven, gradle etc)? – Dave Syer Jul 01 '14 at 06:39
  • The war is not using maven dependency, but the spring boot jar is... so I'm adding the dependency jars into the war -> lib. – user3780135 Jul 01 '14 at 14:17
  • Sorry, that's not very clear. Can you share your project, or a minimal one with the same problem? – Dave Syer Jul 02 '14 at 07:55