Dropwizard:新的管理员资源

12

我正在使用 Drowpizard 0.7.1,但很快可能会升级到 0.8.4。

有人知道如何将管理员资源添加到 Dropwizard 中,并在操作菜单中显示,就像下面的示例一样吗?

Operational Menu

    Metrics
    Ping
    Threads
    Healthcheck
    CustomAdminXy

这个没有新的想法吗? - heaphach
还是有人知道如何在DW 0.9.x中实现这个吗? - heaphach
2个回答

9
我认为这不容易做到。
当建立ServerFactory时,AdminServlet也被创建了。也许可以扩展DefaultServerFactory并覆盖createAdminServlet来创建一个带有自定义链接的自定义Admin servlet...(然后您需要通过配置设置服务器工厂。)
这似乎涉及一些代码重复,并且可能非常脆弱。
更容易的方法可能是注册您自己的admin servlet(除了常规的servlet),例如:
environment.admin().addServlet("custom-admin", new CustomAdminServlet())
    .addMapping("/custom-admin");

可能也不是理想的选择。


覆盖ServerFactory似乎是最简单的方法。很遗憾没有更好的方法。但是通过简单地扩展默认设置,这应该是相当直接的。 - pandaadb

3

使用Dropwizard版本0.9.1中的.addMapping(""),可以在不与默认的"/*" AdminServlet映射冲突的情况下覆盖菜单。

在应用程序中:

public void run(final NetworkModelApplicationConfiguration configuration, final Environment environment) {
    environment.admin().addServlet("my-admin-menu", new MyAdminServlet()).addMapping("");
    environment.admin().addServlet("my-admin-feature", new MyAdminFeatureServlet()).addMapping("/myAdminFeature");
}

扩展 AdminServlet 并不是很有用,因为所有属性都是私有的。我构建了一个 HTTPServlet ,它会将资源作为模板进行读取:
public class MyAdminServlet extends HttpServlet {
  private String serviceName;

  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
    this.serviceName = config.getInitParameter("service-name");
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String path = req.getContextPath() + req.getServletPath();
    resp.setStatus(200);
    resp.setHeader("Cache-Control", "must-revalidate,no-cache,no-store");
    resp.setContentType("text/html");
    PrintWriter writer = resp.getWriter();

    try {
      String template = getResourceAsString("/admin.html", "UTF-8");
      String serviceName = this.serviceName == null?"":" (" + this.serviceName + ")";

      writer.println(MessageFormat.format(template, new Object[] { path, serviceName }));
    } finally {
      writer.close();
    }
  }

  String getResourceAsString(String resource, String charSet) throws IOException {
    InputStream in = this.getClass().getResourceAsStream(resource);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) != -1) {
      out.write(buffer, 0, len);
    }
    return out.toString(charSet);
  }
}

我的 /admin.html 资源看起来像这样:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Operational Menu{1}</title>
  </head>
  <body>
    <h1>Operational Menu{1}</h1>
    <ul>
      <li><a href="{0}/metrics?pretty=true">Metrics</a></li>
      <li><a href="{0}/ping">Ping</a></li>
      <li><a href="{0}/threads">Threads</a></li>
      <li><a href="{0}/healthcheck?pretty=true">Healthcheck</a></li>
      <li><a href="{0}/myAdminFeature">My Admin Feature</a></li>
    </ul>
  </body>
</html>

你的 admin.html 是一个“AssetBundle”吗? - hiaclibe
很好的答案。对我有用。 - hiaclibe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接