2015-09-24 30 views
10

Używam Drowpizarda 0.7.1, ale być może wkrótce zmienię go na 0.8.4.Dropwizard: Nowy zasób administratora

Czy ktoś wie, jak dodać zasób administratora do dropwizard, który jest wyświetlany w Menu operacyjne, jak w przykładzie poniżej?

Operational Menu 

    Metrics 
    Ping 
    Threads 
    Healthcheck 
    CustomAdminXy 
+0

Brak nowych pomysłów na to? – heaphach

+0

A może ktoś wie, jak to zrobić w DW 0.9.x? – heaphach

Odpowiedz

5

Nie sądzę, że można to łatwo zrobić.

Urządzenie AdminServlet jest tworzone po utworzeniu ServerFactory. Możliwe, że będzie możliwe rozszerzenie DefaultServerFactory i zastąpienie createAdminServlet w celu utworzenia niestandardowego serwletu administracyjnego za pomocą twoich linków itp. (Trzeba wtedy ustawić fabrycznie serwer za pomocą konfiguracji.)

Wygląda na to, że wiąże się to z powielaniem kod i może być dość kruchy.

To może być łatwiej po prostu zarejestrować swoją administratora serwletu (oprócz regularnej jednym), np .:

environment.admin().addServlet("custom-admin", new CustomAdminServlet()) 
    .addMapping("/custom-admin"); 

Prawdopodobnie nie jest idealny albo.

+0

Nadpisanie właściwości ServerFactory wydaje się najłatwiejszym sposobem. To niefortunne, że nie ma lepszego sposobu. Ale po prostu przedłużając domyślne, powinno to być dość proste. – pandaadb

2

Używanie z Dropwizard w wersji 0.9.1 pozwala na zastąpienie menu bez konfliktu z domyślnym mapowaniem AdminServlet pod adresem "/*".

w zgłoszeniu:

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"); 
} 

Rozszerzanie AdminServlet nie jest bardzo przydatne, ponieważ wszystkie właściwości są prywatne. I zbudował HttpServlet który czyta zasób jako szablonu:

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); 
    } 
} 

Moja /admin.html zasób wygląda tak:

<!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> 
+0

Czy Twój admin.html jest "AssetBundle"? – hiaclibe

+0

Dobra odpowiedź. Pracuje dla mnie. – hiaclibe