Reputation: 1033
I'm new to spring mvc and I've followed the starter guide to import the hello web
application (Service Web Content
at the Spring Tool Suite). It works great as a standalone application using embedded Tomcat servlet.
I then proceeded to package the application as a war. Actual steps taken are as following:
SpringBootServletInitializer
and add a SpringApplicationBuilder configure method.provided
. war
.However after exporting & deploying gs-serving-web-content-initial.war to jboss AS 7 I couldn't find a way to access the app!
Both http://localhost:8080/greeting
and http://localhost:8080/gs-serving-web-content-initial/greeting
gives the same 404 The requested resource (/greeting) is not available.
. (Another war built before with structs is tested to work fine on the same jboss)
Adding a jboss-web.xml doesn't work either. So what am I missing?
update 20151217:
Related JBoss log appended as below. A warning (JBAS011006) shows when deploying the war but it seems to be normal for spring wars?
09:06:06,107 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876: Starting deployment of "gs-serving-web-content-initial.war"
09:06:06,970 WARN [org.jboss.as.ee] (MSC service thread 1-2) JBAS011006: Not installing optional component org.springframework.http.server.ServletServerHttpAsyncRequestControl due to exception: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011054: Could not find default constructor for class org.springframework.http.server.ServletServerHttpAsyncRequestControl
at org.jboss.as.ee.component.ComponentDescription$DefaultComponentConfigurator.configure(ComponentDescription.java:606)
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:81)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_91]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_91]
09:06:06,971 WARN [org.jboss.as.ee] (MSC service thread 1-2) JBAS011006: Not installing optional component org.springframework.web.context.request.async.StandardServletAsyncWebRequest due to exception: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011054: Could not find default constructor for class org.springframework.web.context.request.async.StandardServletAsyncWebRequest
at org.jboss.as.ee.component.ComponentDescription$DefaultComponentConfigurator.configure(ComponentDescription.java:606)
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:81)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_91]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_91]
09:06:07,142 INFO [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/gs-serving-web-content-initial]] (MSC service thread 1-2) Spring WebApplicationInitializers detected on classpath: [org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration@52fd8833, hello.Application@2f8f6d6]
09:06:08,149 INFO [stdout] (MSC service thread 1-2)
09:06:08,149 INFO [stdout] (MSC service thread 1-2) . ____ _ __ _ _
09:06:08,149 INFO [stdout] (MSC service thread 1-2) /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
09:06:08,149 INFO [stdout] (MSC service thread 1-2) ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
09:06:08,149 INFO [stdout] (MSC service thread 1-2) \\/ ___)| |_)| | | | | || (_| | ) ) ) )
09:06:08,149 INFO [stdout] (MSC service thread 1-2) ' |____| .__|_| |_|_| |_\__, | / / / /
09:06:08,149 INFO [stdout] (MSC service thread 1-2) =========|_|==============|___/=/_/_/_/
09:06:08,150 INFO [stdout] (MSC service thread 1-2) :: Spring Boot :: (v1.3.0.RELEASE)
09:06:08,150 INFO [stdout] (MSC service thread 1-2)
09:06:08,241 INFO [hello.Application] (MSC service thread 1-2) Starting Application on localhost.localdomain with PID 16909 (started by jboss in /usr/share/jboss-as-7.1.1.Final)
09:06:08,242 INFO [hello.Application] (MSC service thread 1-2) No profiles are active
09:06:08,456 INFO [org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext] (MSC service thread 1-2) Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@116d77df: startup date [Thu Dec 17 09:06:08 HKT 2015]; root of context hierarchy
09:06:09,278 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] (MSC service thread 1-2) Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
09:06:09,537 INFO [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor] (MSC service thread 1-2) JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
09:06:09,580 INFO [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/gs-serving-web-content-initial]] (MSC service thread 1-2) Initializing Spring embedded WebApplicationContext
09:06:09,581 INFO [org.springframework.web.context.ContextLoader] (MSC service thread 1-2) Root WebApplicationContext: initialization completed in 1126 ms
09:06:10,062 INFO [org.springframework.boot.context.embedded.ServletRegistrationBean] (MSC service thread 1-2) Mapping servlet: 'dispatcherServlet' to [/]
09:06:10,063 INFO [org.springframework.boot.context.embedded.FilterRegistrationBean] (MSC service thread 1-2) Mapping filter: 'errorPageFilter' to: [/*]
09:06:10,063 INFO [org.springframework.boot.context.embedded.FilterRegistrationBean] (MSC service thread 1-2) Mapping filter: 'characterEncodingFilter' to: [/*]
09:06:10,063 INFO [org.springframework.boot.context.embedded.FilterRegistrationBean] (MSC service thread 1-2) Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
09:06:10,063 INFO [org.springframework.boot.context.embedded.FilterRegistrationBean] (MSC service thread 1-2) Mapping filter: 'httpPutFormContentFilter' to: [/*]
09:06:10,063 INFO [org.springframework.boot.context.embedded.FilterRegistrationBean] (MSC service thread 1-2) Mapping filter: 'requestContextFilter' to: [/*]
09:06:10,208 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter] (MSC service thread 1-2) Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@116d77df: startup date [Thu Dec 17 09:06:08 HKT 2015]; root of context hierarchy
09:06:10,347 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-2) Mapped "{[/greeting]}" onto public java.lang.String hello.GreetingController.greeting(java.lang.String,org.springframework.ui.Model)
09:06:10,349 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-2) Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
09:06:10,349 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-2) Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
09:06:10,374 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-2) Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
09:06:10,375 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-2) Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
09:06:10,451 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-2) Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
09:06:10,896 INFO [org.springframework.jmx.export.annotation.AnnotationMBeanExporter] (MSC service thread 1-2) Registering beans for JMX exposure on startup
09:06:11,231 INFO [hello.Application] (MSC service thread 1-2) Started Application in 3.996 seconds (JVM running for 78143.668)
09:06:11,235 INFO [org.jboss.web] (MSC service thread 1-2) JBAS018210: Registering web context: /gs-serving-web-content-initial
09:06:11,269 INFO [org.jboss.as.server] (HttpManagementService-threads - 4) JBAS018559: Deployed "gs-serving-web-content-initial.war"
Upvotes: 4
Views: 7311
Reputation: 96
I had the same problem with spring boot 1.3.3 app and jboss eap 6.4.x.
Spring boot uses '/' as the default path of the main dispatcher servlet what jboss does not understand correctly (or "too much correctly") and maps servlet dispatcher to '/' instead of '/*', as mentioned in your log:
09:06:10,062 INFO [org.springframework.boot.context.embedded.ServletRegistrationBean] (MSC service thread 1-2) Mapping servlet: 'dispatcherServlet' to [/] ...
Try to change to something else, for example /xxx or /* using application.properties of your spring boot app:
server.servlet-path=/*
Now, jboss correctly maps dispatcher servlet to '/xxx/*', resp. '/*'.
Upvotes: 6
Reputation: 1033
After 2 days of investigation / searching I think I would mark my findings here as an answer.
jboss-web.xml
to the war has some effects, but it has to be in the correct path.Add the following jboss-web.xml
to gs-serving-web-content-initial.war\WEB-INF:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>myapp</context-root>
</jboss-web>
JBoss would use the requested context path:
09:53:57,523 INFO [hello.Application] (MSC service thread 1-1) Started Application in 3.192 seconds (JVM running for 167409.96)
09:53:57,541 INFO [org.jboss.web] (MSC service thread 1-1) JBAS018210: Registering web context: /myapp
09:53:57,591 INFO [org.jboss.as.server] (HttpManagementService-threads - 7) JBAS018559: Deployed "gs-serving-web-content-initial.war"
However this doesn't help the 404 problem at all so the context name shouldn't be the cause.
According to this article, JBoss 7.1.1 Final (I'm also using this) seems to behave strangely on spring boot apps and Spring’s DispatcherServlet
would not get instantiated properly
. I guess that's causing the mapping for /greeting
fails and thus the 404 error.
Conclusion:
The solution in the linked article is too complicated for me to follow, and also doesn't seem to worth to do so since I'm starting a new project instead of migrating. I guess I will abandon Spring Boot and fallback to simple Spring MVC.
Please tell me if I'm missing anything, else I will mark the question answered tomorrow. Thanks all!
Upvotes: 3