2017-10-02 22 views
0

WebLogic 12cでGraphQLサンプルJavaアプリケーションを実行していますが、起動時にサーブレットでエラーが発生しました。サーブレットが設定され、以下のようにServletRegistrationBeanを使用して私たちのサーブレットを登録したSpringブート - WebLogic 12cでServletRegistrationBeanを初期化できません

@Configuration 
@ConditionalOnWebApplication 
@ConditionalOnClass(DispatcherServlet.class) 
@ConditionalOnBean({GraphQLSchema.class, GraphQLSchemaProvider.class}) 
@ConditionalOnProperty(value = "graphql.servlet.enabled", havingValue = "true", matchIfMissing = true) 
@AutoConfigureAfter({GraphQLJavaToolsAutoConfiguration.class, SpringGraphQLCommonAutoConfiguration.class}) 
@EnableConfigurationProperties(GraphQLServletProperties.class) 

public class GraphQLWebAutoConfiguration { 
    ... 
    @Bean 
    @ConditionalOnMissingBean 
    public GraphQLServlet graphQLServlet(GraphQLSchemaProvider schemaProvider, ExecutionStrategyProvider executionStrategyProvider) { 
     return new SimpleGraphQLServlet(schemaProvider, executionStrategyProvider, listeners, instrumentation, errorHandler, contextBuilder); 
    } 

    @Bean 
    ServletRegistrationBean graphQLServletRegistrationBean(GraphQLServlet servlet) { 
     ServletRegistrationBean bean = new ServletRegistrationBean(servlet, graphQLServletProperties.getServletMapping()); 
     bean.setLoadOnStartup(1); 
     return bean; 
    } 
} 

WebLogic Serverのログでは、エラーを出力します:

<Oct 2, 2017 1:51:28 PM SGT> <Error> <HTTP> <BEA-101125> <[[email protected][app:CPRES module:CPRES path:null spec-version:3.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(WebComponentContributor.java:252) 
     at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributor.java:245) 
     at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentContributor.java:274) 
     at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.newServletInstanceIfNecessary(StubSecurityHelper.java:365) 
     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(WebComponentContributor.java:252) 
     at weblogic.servlet.internal.WebComponentContributor.getNewInstance(WebComponentContributor.java:245) 
     at weblogic.servlet.internal.WebComponentContributor.createServletInstance(WebComponentContributor.java:274) 
     Truncated. see log file for complete stacktrace 
> 
<Oct 2, 2017 1:51:28 PM SGT> <Error> <HTTP> <BEA-101216> <Servlet: "simpleGraphQLServlet" failed to preload on startup in Web application: "CPRES". 
javax.servlet.ServletException: Servlet class: 'graphql.servlet.SimpleGraphQLServlet' couldn't be instantiated 
     at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:326) 
     at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:294) 
     at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326) 
     at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:196) 
     at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) 
     Truncated. see log file for complete stacktrace 
> 
<Oct 2, 2017 1:51:29 PM SGT> <Error> <Deployer> <BEA-149265> <Failure occurred in the execution of deployment request with ID "19094957742917053" for task "130" on [partition-name: DOMAIN]. Error is: "weblogic.application.ModuleException: javax.servlet.ServletException: Servlet class: 'graphql.servlet.SimpleGraphQLServlet' couldn't be instantiated" 
weblogic.application.ModuleException: javax.servlet.ServletException: Servlet class: 'graphql.servlet.SimpleGraphQLServlet' couldn't be instantiated 

それは、WebLogicがしようとしていることになりますSpringコンテキストによって作成および管理されるServletBean SimpleGraphQLServletの代わりに、新しいサーブレットインスタンスを作成します。

ありがとう。

+0

あなたがweblogic.xmlのがありますか? 'prefer-application-packages'を設定することができます – Patrick

+0

' SimpleGraphQLServlet'に '@WebServlet'というアノテーションが付いていますか?もしそうなら、それを取り除く。 –

+0

はい、weblogic.xmlがWEB-INFフォルダに追加されました。 SimpleGraphServletは@WebServletで注釈されません。 ServletRegistrationBeanメソッドを使用してSpringBootでサーブレットを登録すると、別のBeanを参照できるようになりますか?これは、Bean名を使用してサーブレットを登録し、サーブレットコンテナによって新しいインスタンスを作成するという感覚を与えます。 – user3432316

答えて

0

walkaroundソリューションは、このようなサーブレットラッパークラスを記述することです:

public class DelegateGraphQLServlet extends HttpServlet { 
    protected GraphQLServlet graphQLServlet; 

    public void init(ServletConfig servletConfig) throws ServletException { 
     super.init(servletConfig); 

     ApplicationContext ac = (ApplicationContext) servletConfig.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
     this.graphQLServlet = (GraphQLServlet)ac.getBean("graphQLServlet"); 
    } 

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 
     graphQLServlet.service(req, res); 
    } 

} 
関連する問題