2016-08-22 256 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中部署並運行而沒有任何錯誤是很棘手的。