Servlets Dropwizard-覆盖healthcheck端点的url

Servlets Dropwizard-覆盖healthcheck端点的url,servlets,jetty,dropwizard,Servlets,Jetty,Dropwizard,Dropwizard使用Codahale Metrics HealthCheck servlet。在dropwizard之外使用servlet时,可以通过设置init参数“healthcheck URI”覆盖URI 有没有办法在dropwizard中覆盖它 看起来这与在NonblockingServletHolder上设置init参数有关。构建NonblockingServletHolder是正确的。问题是Dropwizard DefaultServerFactory没有传输applicatio

Dropwizard使用Codahale Metrics HealthCheck servlet。在dropwizard之外使用servlet时,可以通过设置init参数“healthcheck URI”覆盖URI

有没有办法在dropwizard中覆盖它


看起来这与在NonblockingServletHolder上设置init参数有关。

构建NonblockingServletHolder是正确的。问题是Dropwizard DefaultServerFactory没有传输applicationContext或adminContext中设置的任何参数,这两者都是Dropwizard环境的一部分

我相信您唯一可行的选择是扩展AbstractServerFactory,并在初始化AdminServlet之前在配置中设置init参数。DefaultServerFactory可以通过配置子类进行扩展和设置

class MyServerFactory extends DefaultServerFactory{
        //Copied from AbstractServerFactory
        protected Handler createAdminServlet(Server server,
                                             MutableServletContextHandler handler,
                                             MetricRegistry metrics,
                                             HealthCheckRegistry healthChecks) {
            //Copied from AbstractServerFactory.configureSessionsAndSecurity because its private and can't be called here
            if (handler.isSecurityEnabled()) {
                handler.getSecurityHandler().setServer(server);
            }
            if (handler.isSessionsEnabled()) {
                handler.getSessionHandler().setServer(server);
            }
            handler.setServer(server);
            handler.getServletContext().setAttribute(MetricsServlet.METRICS_REGISTRY, metrics);
            handler.getServletContext().setAttribute(HealthCheckServlet.HEALTH_CHECK_REGISTRY, healthChecks);
            //HERE - set the init parameter and add the servlet
            def holder = new NonblockingServletHolder(new AdminServlet())
            holder.setInitParameter("healthcheck-uri", "/myurl")
            handler.addServlet(holder, "/*");
            //END

            handler.addFilter(AllowedMethodsFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST))
                    .setInitParameter(AllowedMethodsFilter.ALLOWED_METHODS_PARAM, Joiner.on(',').join(allowedMethods));
            return handler;
        }
    }
配置子类:

class MyConfiguration extends Configuration{

  MyConfiguration(){
    setServerFactory(new MyServerFactory())
  }
} 
为了它的价值

    environment.adminContext.setInitParameter("healthcheck-uri","/something")
    environment.applicationContext.setInitParameter("healthcheck-uri","/something")
    environment.servlets().setInitParameter("healthcheck-uri","/something")
    environment.admin().setInitParameter("healthcheck-uri","/something")
我深入到初始化servlet的代码中,过了一段时间,我意识到如果不重写ServerFactory正在做的事情,我就无法做任何事情: dropwizard环境具有adminContext、applicationContext和ServletEnvironment,所有这些都允许您设置初始化参数。AdminServlet类是使用“healthcheck uri”的init参数的地方,因此我希望在adminContext中设置这些参数会将它们传递给AdminServlet,但遗憾的是,这并不是因为最终设置AdminServlet的Jetty ServletContextHandler将init参数埋藏在_servletHandler._servletContext._initParams中

这些都不能为您做任何事

    environment.adminContext.setInitParameter("healthcheck-uri","/something")
    environment.applicationContext.setInitParameter("healthcheck-uri","/something")
    environment.servlets().setInitParameter("healthcheck-uri","/something")
    environment.admin().setInitParameter("healthcheck-uri","/something")

你还有问题吗?