微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

扩展SpringBootServletInitializer时如何注册DispatcherServlets并覆盖onStartup

如何解决扩展SpringBootServletInitializer时如何注册DispatcherServlets并覆盖onStartup

我有一个Spring Boot应用程序,该应用程序正在部署到Tomcat的外部实例。主类扩展了SpringBootServletinitializer并覆盖了 configure onStartup 方法。在方法 configure 中,初始化了一个自定义环境,以提供一个加密器来解密activemq的用户密码,因为jasypt直到activemq之后才被初始化。这是我从jasypt-spring-boot文档中获得的。

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    try {
        StandardEncryptableServletEnvironment env = StandardEncryptableServletEnvironment.builder().encryptor(encryptor).build();
        return application.environment(env).sources(AxleServer.class);
    } catch (FileNotFoundException e) {
        logger.error("Could not load encryptable environment",e);
        return application.sources(AxleServer.class);
    }
}

方法 onStartup 中,我正在配置dispatcherServlets:

@Override
    public void onStartup(ServletContext servletContext) throws servletexception {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(RemotingConfig.class);
        servletContext.addListener(new ContextLoaderListener(context));
        
        ServletRegistration.Dynamic restdispatcher = servletContext.addServlet("rest-dispatcher",new dispatcherServlet(context));
        restdispatcher.setLoadOnStartup(1);
        restdispatcher.addMapping("/rest/*");

        ServletRegistration.Dynamic remotingdispatcher = servletContext.addServlet("remoting-dispatcher",new dispatcherServlet(context));
        remotingdispatcher.setLoadOnStartup(2);
        remotingdispatcher.addMapping("/remoting/*");
    }

问题在于,从未调用 configure 方法,因为它是从 onStartup 的超级实现中调用的。我尝试调用超级实现super.onStartup(servletContext);,但随后出现一个错误,即在部署应用程序时根上下文已经存在。

注册dispatcherServlet和重写onStartup方法的正确方法是什么?是否需要调用onStartup的超级实现?

解决方法

我能够通过首先调用super.onStartup然后从ServletContext属性获取根上下文来解决此问题

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    Object obj = servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    if(obj instanceof AnnotationConfigServletWebServerApplicationContext) {
        AnnotationConfigServletWebServerApplicationContext context = (AnnotationConfigServletWebServerApplicationContext) obj;
        context.register(RemotingConfig.class);
            
        ServletRegistration.Dynamic restDispatcher = servletContext.addServlet("rest-dispatcher",new DispatcherServlet(context));
        restDispatcher.setLoadOnStartup(1);
        restDispatcher.addMapping("/rest/*");

        ServletRegistration.Dynamic remotingDispatcher = servletContext.addServlet("remoting-dispatcher",new DispatcherServlet(context));
        remotingDispatcher.setLoadOnStartup(2);
        remotingDispatcher.addMapping("/remoting/*");
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。