Spring 当部署在 Websphere Liberty Profile 中时,引导仅在第一个请求中初始化上下文
Spring Boot initializes context only in the first request when deployed in Websphere Liberty Profile
这是背景。
我正在尝试将 Spring 启动应用程序部署到 Websphere Liberty Profile 中。
我已经在 pom 文件中进行了必要的更改
- 打包为war
- 排除并标记相关依赖项的依赖项冲突解决方案
- 更改了主应用程序 class 以扩展
SpringBootServletInitializer
并实现 WebApplicationInitializer
。
然后我将打包好的 war 放到 websphere liberty 配置文件服务器的 dropins 目录中。
此刻我的期望是应用程序部署并初始化上下文并准备好处理它收到的任何 http 请求。
但是我在日志中看到以下内容
[AUDIT ] CWWKT0016I: Web application available (default_host): http://localhost:9082/sringbootapp/
[AUDIT ] CWWKZ0001I: Application sringbootapp started in 8,197 seconds.
这意味着服务器已检测到并部署了该应用程序。当我在应用程序中请求服务时,才会显示以下日志:
(Spring Boot Banner)
2016-05-25T16:39:08,454 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.context.ContextLoader" jLocL=272 jMess=[[Root WebApplicationContext: initialization completed in 8822 ms]]
2016-05-25T16:39:24,993 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" jLocL=539 jMess=[[Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65f1bd54: startup date [Wed May 25 16:38:59 CEST 2016]; root of context hierarchy]]
2016-05-25T16:39:25,673 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/cart/predicate]}" onto public void no.dnb.vaap.querydsl.controller.CartController.getCartUsingQueryDslPredicate()]]
2016-05-25T16:39:25,673 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/cart/query]}" onto public void no.dnb.vaap.querydsl.controller.CartController.getCustomerUsingQueryDslQuery()]]
2016-05-25T16:39:25,720 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[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)]]
2016-05-25T16:39:25,720 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]]
2016-05-25T16:39:26,094 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:26,109 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:26,376 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:28,605 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.DispatcherServlet" jLocL=487 jMess=[[FrameworkServlet 'dispatcherServlet': initialization started]]
2016-05-25T16:39:28,672 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.DispatcherServlet" jLocL=506 jMess=[[FrameworkServlet 'dispatcherServlet': initialization completed in 67 ms]]
现在这意味着,spring 上下文仅在应用程序部署后的第一个请求期间才初始化。
有人遇到过这个问题吗?我错过了什么吗?
我的 pom 文件
<modelVersion>4.0.0</modelVersion>
<groupId>no.dnb.amn</groupId>
<version>0.0.1-SNAPSHOT</version>
<artifactId>querydsl</artifactId>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
</exclusions>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>3.7.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<classifier>apt</classifier>
<version>3.7.2</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我的主要应用程序
@SpringBootApplication
@EnableJpaRepositories
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
WLP server.xml
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>jsp-2.2</feature>
<feature>localConnector-1.0</feature>
</featureManager>
<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint httpPort="9082" httpsPort="9443" id="defaultHttpEndpoint"/>
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
<applicationMonitor updateTrigger="mbean"/>
<include location="xsServerConfig.xml"/>
提前致谢
Spring 在容器中启动需要 Servlet-3.0。
由于您没有在 server.xml 中明确命名该功能,因此可能是这种情况。
添加它,如下所述:
https://www.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_setup_feat.html
<featureManager>
<feature>servlet-3.0</feature>
...
</featureManager>
接下来,我会尝试将 WAR 添加为应用程序条目,而不是通过 dropins 目录删除,如下所述:
https://www.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_dep_war.html
<application context-root="helloworld" type="war" id="helloworld"
location="helloworld.war" name="helloworld"/>
其中 位置 必须指向您的 war。
我刚刚遇到了同样的问题。答案是指定:
<webContainer deferServletLoad="false"/>
这是背景。 我正在尝试将 Spring 启动应用程序部署到 Websphere Liberty Profile 中。 我已经在 pom 文件中进行了必要的更改
- 打包为war
- 排除并标记相关依赖项的依赖项冲突解决方案
- 更改了主应用程序 class 以扩展
SpringBootServletInitializer
并实现WebApplicationInitializer
。
然后我将打包好的 war 放到 websphere liberty 配置文件服务器的 dropins 目录中。
此刻我的期望是应用程序部署并初始化上下文并准备好处理它收到的任何 http 请求。
但是我在日志中看到以下内容
[AUDIT ] CWWKT0016I: Web application available (default_host): http://localhost:9082/sringbootapp/
[AUDIT ] CWWKZ0001I: Application sringbootapp started in 8,197 seconds.
这意味着服务器已检测到并部署了该应用程序。当我在应用程序中请求服务时,才会显示以下日志:
(Spring Boot Banner)
2016-05-25T16:39:08,454 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.context.ContextLoader" jLocL=272 jMess=[[Root WebApplicationContext: initialization completed in 8822 ms]]
2016-05-25T16:39:24,993 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" jLocL=539 jMess=[[Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65f1bd54: startup date [Wed May 25 16:38:59 CEST 2016]; root of context hierarchy]]
2016-05-25T16:39:25,673 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/cart/predicate]}" onto public void no.dnb.vaap.querydsl.controller.CartController.getCartUsingQueryDslPredicate()]]
2016-05-25T16:39:25,673 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/cart/query]}" onto public void no.dnb.vaap.querydsl.controller.CartController.getCustomerUsingQueryDslQuery()]]
2016-05-25T16:39:25,720 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[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)]]
2016-05-25T16:39:25,720 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" jLocL=534 jMess=[[Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]]
2016-05-25T16:39:26,094 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:26,109 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:26,376 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" jLocL=341 jMess=[[Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]]]
2016-05-25T16:39:28,605 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.DispatcherServlet" jLocL=487 jMess=[[FrameworkServlet 'dispatcherServlet': initialization started]]
2016-05-25T16:39:28,672 thrId="[Default Executor-thread-1009]" lLv="INFO" uid="" [[]] jLoc="org.springframework.web.servlet.DispatcherServlet" jLocL=506 jMess=[[FrameworkServlet 'dispatcherServlet': initialization completed in 67 ms]]
现在这意味着,spring 上下文仅在应用程序部署后的第一个请求期间才初始化。
有人遇到过这个问题吗?我错过了什么吗?
我的 pom 文件
<modelVersion>4.0.0</modelVersion>
<groupId>no.dnb.amn</groupId>
<version>0.0.1-SNAPSHOT</version>
<artifactId>querydsl</artifactId>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
</exclusions>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>3.7.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<classifier>apt</classifier>
<version>3.7.2</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
我的主要应用程序
@SpringBootApplication
@EnableJpaRepositories
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
WLP server.xml
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>jsp-2.2</feature>
<feature>localConnector-1.0</feature>
</featureManager>
<!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
<httpEndpoint httpPort="9082" httpsPort="9443" id="defaultHttpEndpoint"/>
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
<applicationMonitor updateTrigger="mbean"/>
<include location="xsServerConfig.xml"/>
提前致谢
Spring 在容器中启动需要 Servlet-3.0。 由于您没有在 server.xml 中明确命名该功能,因此可能是这种情况。 添加它,如下所述: https://www.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_setup_feat.html
<featureManager>
<feature>servlet-3.0</feature>
...
</featureManager>
接下来,我会尝试将 WAR 添加为应用程序条目,而不是通过 dropins 目录删除,如下所述: https://www.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/twlp_dep_war.html
<application context-root="helloworld" type="war" id="helloworld"
location="helloworld.war" name="helloworld"/>
其中 位置 必须指向您的 war。
我刚刚遇到了同样的问题。答案是指定:
<webContainer deferServletLoad="false"/>