Spring 引导 ServletRegistrationBean 并部署到外部 Tomcat
Spring Boot ServletRegistrationBean and Deployment to External Tomcat
最近我发现可以使用 Spring Boot 附带的 ServletRegistrationBean 将我自己的 servlet bean 添加到 MVC。但文档似乎表明这仅适用于嵌入式 servlet 容器:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html
我的简单问题是:ServletRegistrationBean 是否只能与嵌入式容器一起使用,或者也可以在将 war 部署到外部 Tomcat 时使用?
ServletRegistrationBean
也将与外部 Tomcat 一起工作,事实上,这正是当您将 Boot 应用程序部署到 Tomcat(或任何其他 Servlet 容器)。
我在将 spring 启动 war 文件部署到 weblogic 时遇到了类似的问题。 servlet 能够在 Servlet 3.x web 容器的支持下注册。但是 weblogic 正在尝试创建 servlet bean 的新 servlet 实例实例。
@Bean
@ConditionalOnMissingBean
public GraphQLServlet graphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider) {
return new SimpleGraphQLServlet(schemaProvider, executionStrategyProvider, objectMapperConfigurer, listeners, instrumentation, errorHandler, contextBuilder, graphQLRootObjectBuilder);
}
@Bean
ServletRegistrationBean graphQLServletRegistrationBean(GraphQLServlet servlet) {
return new ServletRegistrationBean(servlet, graphQLServletProperties.getServletMapping());
}
并且 weblogic 抛出这样的异常:
<Oct 2, 2017 4:08:31 PM SGT> <Error> <HTTP> <BEA-101125> <[ServletContext@344074943[app:cpapps-gra3.1]] Error occurred while instantiating servlet: "simpleGraphQLServlet".
java.lang.InstantiationException: graphql.servlet.SimpleGraphQLServlet
at java.lang.Class.newInstance(Class.java:427)
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentCon
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.newServletInstanceIfNece
Truncated. see log file for complete stacktrace
Caused By: java.lang.NoSuchMethodException: graphql.servlet.SimpleGraphQLServlet.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentCon
Truncated. see log file for complete stacktrace
>
Web 请求似乎直接转到 weblogic 而不是 spring 调度程序 servlet。
但是很难看到可以在 tomcat 中部署相同的 war 文件和 运行 而没有任何错误。
最近我发现可以使用 Spring Boot 附带的 ServletRegistrationBean 将我自己的 servlet bean 添加到 MVC。但文档似乎表明这仅适用于嵌入式 servlet 容器:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html 我的简单问题是:ServletRegistrationBean 是否只能与嵌入式容器一起使用,或者也可以在将 war 部署到外部 Tomcat 时使用?
ServletRegistrationBean
也将与外部 Tomcat 一起工作,事实上,这正是当您将 Boot 应用程序部署到 Tomcat(或任何其他 Servlet 容器)。
我在将 spring 启动 war 文件部署到 weblogic 时遇到了类似的问题。 servlet 能够在 Servlet 3.x web 容器的支持下注册。但是 weblogic 正在尝试创建 servlet bean 的新 servlet 实例实例。
@Bean
@ConditionalOnMissingBean
public GraphQLServlet graphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider) {
return new SimpleGraphQLServlet(schemaProvider, executionStrategyProvider, objectMapperConfigurer, listeners, instrumentation, errorHandler, contextBuilder, graphQLRootObjectBuilder);
}
@Bean
ServletRegistrationBean graphQLServletRegistrationBean(GraphQLServlet servlet) {
return new ServletRegistrationBean(servlet, graphQLServletProperties.getServletMapping());
}
并且 weblogic 抛出这样的异常:
<Oct 2, 2017 4:08:31 PM SGT> <Error> <HTTP> <BEA-101125> <[ServletContext@344074943[app:cpapps-gra3.1]] Error occurred while instantiating servlet: "simpleGraphQLServlet".
java.lang.InstantiationException: graphql.servlet.SimpleGraphQLServlet
at java.lang.Class.newInstance(Class.java:427)
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentCon
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.newServletInstanceIfNece
Truncated. see log file for complete stacktrace
Caused By: java.lang.NoSuchMethodException: graphql.servlet.SimpleGraphQLServlet.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributo
at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentCon
Truncated. see log file for complete stacktrace
>
Web 请求似乎直接转到 weblogic 而不是 spring 调度程序 servlet。
但是很难看到可以在 tomcat 中部署相同的 war 文件和 运行 而没有任何错误。