最近我发现可以使用Spring Boot附带的ServletRegistrationBean将我自己的servlet bean添加到MVC。但文档似乎表明这仅适用于嵌入式servlet容器:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html 我的简单问题是:ServletRegistrationBean只能用于嵌入式容器,还能用于向外部Tomcat部署war?
答案 0 :(得分:3)
ServletRegistrationBean
也可以与外部Tomcat一起使用,实际上,当您将Boot应用程序部署到Tomcat(或任何其他Servlet容器)时,Boot正是如何注册自己的DispatcherServlet
。
答案 1 :(得分:0)
将spring boot 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 dispatcher servlet。
但是看到可以在tomcat中部署和运行相同的war文件而没有任何错误是很棘手的。