【问题标题】:How do I init()/initialize() a Scalatra servlet on startup?如何在启动时 init()/initialize() Scalatra servlet?
【发布时间】:2014-01-14 23:36:45
【问题描述】:

当我们从开发中的 Jetty 迁移到生产中的 Tomcat 时,我们发现我们的 Swagger 文档停止工作 - 直到第一次调用提供操作的 servlet 之后,Swagger 文档中才会显示任何操作。

在调试器中进行了一些工作后,我们将问题追溯到 servlet 的 init() 方法没有被调用。我假设 Jetty 将所有 servlet 视为启动时加载,而 Tomcat 不是,除非您在 web.xml 中明确告诉它。

不幸的是,在 web.xml 中,您可以设置为启动时加载的唯一内容是 servlet,在我们的 Scalatra web.xml 中没有实际的 servlet,只有侦听器和 servlet-mappings。

我们如何让 Scalatra 在启动时初始化我们的各种ScalatraServlets


注意:我们使用的是 Scalatra 2.2.2。迁移到 2.3 快照或里程碑很可能会解决 Swagger 问题,但我们已经做了很多工作以使 2.2 Swagger 集成正常工作,而且我们离上线太近了,无法将其全部删除。

【问题讨论】:

    标签: tomcat scalatra


    【解决方案1】:

    编辑:这已经进入 Scalatra 并且应该很快就会可用,请参阅 https://github.com/scalatra/scalatra/pull/356

    是的,默认情况下,Tomcat 在向它发出第一个 HTTP 请求之前不会加载 Servlet。不过,您可以使用load-on-startup 告诉Tomcat 加载Servlet。这是一种使用LifeCycle 以编程方式执行此操作的方法:

    def mountServlet(sc: ServletContext, servlet: HttpServlet, urlPattern: String, loadOnStartup: Int = 1) {
      val name = servlet.getClass.getName
      val reg = Option(sc.getServletRegistration(name)) getOrElse {
        val r = sc.addServlet(name, servlet)
        servlet match {
          case s: HasMultipartConfig =>
            r.setMultipartConfig(s.multipartConfig.toMultipartConfigElement)
          case _ =>
        }
        if (servlet.isInstanceOf[ScalatraAsyncSupport])
          r.setAsyncSupported(true)
        r.setLoadOnStartup(loadOnStartup)
        r
      }
    
      reg.addMapping(urlPattern)
    }
    

    这定义了RichServletContextmount 方法的替代方法。重要的部分是r.setLoadOnStartup(loadOnStartup)

    你可以这样使用它:

    override def init(context: ServletContext) {
    
      val comments = CommentsRepository(mongoColl)
    
      // mount the api + swagger docs
      mountServlet(context, new CommentsApi(comments), "/api/*", 1)
      mountServlet(context, new CommentsApiDoc(), "/api-docs/*", 2)
    
      mountServlet(context, new CommentsFrontend(comments), "/*")
    
    }
    

    示例代码取自https://github.com/scalatra/scalatra-in-action/blob/d325c85feaf10706951c8edb88a3d82d0488faf3/comments-collector/src/main/scala/ScalatraBootstrap.scala

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2014-02-07
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2013-05-27
      相关资源
      最近更新 更多