Spring Boot ServletRegistrationBean和部署到外部Tomcat

时间:2016-08-22 15:04:43

标签: spring spring-mvc tomcat spring-boot servlet-3.0

最近我发现可以使用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?

2 个答案:

答案 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文件而没有任何错误是很棘手的。