2016-08-22 108 views
1

最近我发现使用Spring Boot附带的ServletRegistrationBean将我自己的servlet bean添加到MVC的可能性。但文档似乎表明,这只适用于嵌入式servlet容器:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html 我的一个简单问题是:ServletRegistrationBean只能用于嵌入容器,或者也可以在将战争部署到外部Tomcat时使用?Spring Boot ServletRegistrationBean和部署到外部Tomcat

回答

2

ServletRegistrationBean也可以与外部Tomcat一起使用,事实上,当您将引导应用程序部署到Tomcat(或任何其他Servlet容器)时,Boot正是如何注册自己的DispatcherServlet

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> <[[email protected][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的,而不是春季调度的servlet。

但是,看到相同的war文件可以在tomcat中部署并运行而没有任何错误是很棘手的。

相关问题