title: LifecycleException deploying Spring Boot WebSocket example into Tomcat
body: <p>After successfully running through the <a href="http://spring.io/guides/gs/messaging-stomp-websocket/" rel="nofollow">Spring getting started guide for WebSocket</a>, I want desperately to build this application as a WAR and deploy it into Tomcat.  I have done my best to modify the project to build as a WAR file by following the <a href="http://spring.io/guides/gs/convert-jar-to-war/" rel="nofollow">Spring getting started guide for converting a Spring Boot JAR to a WAR</a>, but when I deploy the resulting WAR, Tomcat throws an exception.</p>
  
  <p>I'm developing using STS 3.4.0 with Gradle 1.10 (I switched to this after previously failing to successfully deploy when building with Maven in Eclipse).  Gradle reports a successfully built WAR file, but when I attempt to deploy it into Tomcat, the following exception is thrown:</p>
  
  <pre><code>09-Feb-2014 17:30:27.537 SEVERE [localhost-startStop-3] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
   org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/gs-messaging-stomp-websocket-0.1.0]]
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:699)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1763)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
      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:744)
  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatEmbeddedServletContainerFactory' defined in class path resource [org/springframework/boot/autoconfigure/websocket/WebSocketAutoConfiguration$TomcatWebSocketConfiguration.class]: Initialization of bean failed; nested exception is java.lang.ArrayStoreException: org.apache.catalina.valves.RemoteIpValve
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
      at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:658)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:355)
      at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:129)
      at org.springframework.boot.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:90)
      at org.springframework.boot.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:53)
      at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:181)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5237)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      ... 10 more
  Caused by: java.lang.ArrayStoreException: org.apache.catalina.valves.RemoteIpValve
      at org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat.customizeTomcat(ServerProperties.java:212)
      at org.springframework.boot.autoconfigure.web.ServerProperties.customize(ServerProperties.java:117)
      at org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:68)
      at org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor.postProcessBeforeInitialization(EmbeddedServletContainerCustomizerBeanPostProcessor.java:54)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1545)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
      ... 27 more
  </code></pre>
  
  <p>I'm running Tomcat 8.0.0-RC10 on Windows 8.1 64-bit.  I believe the relevant application files are these:</p>
  
  <p>Application.java:</p>
  
  <p>package hello;</p>
  
  <pre><code>import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  
  @Configuration
  @EnableAutoConfiguration
  @ComponentScan
  public class Application {
  
      public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
      }
  }
  </code></pre>
  
  <p>HelloWebXml.java (in lieu of an actual web.xml):</p>
  
  <pre><code>package hello;
  
  import org.springframework.boot.builder.SpringApplicationBuilder;
  import org.springframework.boot.web.SpringBootServletInitializer;
  
  public class HelloWebXml extends SpringBootServletInitializer {
  
      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(Application.class);
      }
  
  }
  </code></pre>
  
  <p>and finally, build.gradle:</p>
  
  <pre><code>buildscript {
      repositories {
          maven { url "http://repo.spring.io/libs-snapshot" }
          mavenLocal()
      }
      dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC1")
      }
  }
  
  apply plugin: 'java'
  apply plugin: 'eclipse'
  apply plugin: 'idea'
  apply plugin: 'spring-boot'
  apply plugin: 'war'
  
  war {
      baseName = 'gs-messaging-stomp-websocket'
      version =  '0.1.0'
  }
  
  repositories {
      mavenCentral()
      maven { url "http://repo.spring.io/libs-snapshot" }
  }
  
  dependencies {
      compile("org.springframework.boot:spring-boot-starter-web:0.5.0.BUILD-SNAPSHOT")
      compile("org.springframework.boot:spring-boot-starter-websocket:0.5.0.BUILD-SNAPSHOT")
      compile("org.springframework:spring-messaging:4.0.0.RELEASE")
      compile("com.fasterxml.jackson.core:jackson-databind")
      testCompile("junit:junit:4.11")
  }
  
  task wrapper(type: Wrapper) {
      gradleVersion = '1.10'
  }
  </code></pre>
  
  <p>I must say, I find it ironic and more than a little frustrating that the problem seem to lie with the tomcatEmbeddedServletContainerFactory.  Thus a feature whose sole purpose (I believe) is to allow the app to be run OUTSIDE of a servlet container --- a feature in which I have absolutely no interest --- is preventing me from properly deploying an app INTO a servlet container.</p>
  
  <p>All help will be appreciated.</p>