为几乎所有路线配置dropwizard到服务器index.html?

时间:2014-03-20 19:18:29

标签: java configuration jetty dropwizard

我正在构建一个单页应用程序,它在客户端和后端执行所有它的html请求路由,它使用dropwizard提供一堆JSON服务。

基本上我无法在dropwizard中使用jetty为每个请求提供index.html服务,但以下路径除外:

  /css
  /i18n
  /img
  /js
  /lib
  /services
  /templates

事实上,我在查找文档方面遇到了很多麻烦,这些文档告诉您如何设置任何http路由。 (我不是一个小家伙)。

这是我简单的yaml配置:`

http:
  port: 8082
  adminPort: 8083
  rootPath: /service/*`

我需要添加什么才能实现这一目标。

由于

3 个答案:

答案 0 :(得分:14)

我在不改变配置的情况下完成了这项工作。事实上,我只需要一行代码,就可以放入initialize类的Application方法:

bootstrap.addBundle(new AssetsBundle("/app", "/", "index.html", "static"));

这基本上表示在我的JAR文件中的/app下以URL模式/提供任何内容,index.html作为默认文件。此捆绑包将命名为 static ,但您可以选择您喜欢的任何名称。

请注意,我使用的是Dropwizard的0.7.0-rc2版本,我不确定它是否适用于早期版本。

答案 1 :(得分:1)

当我去" /"时,@ mthmulders的回答对我有用。当页面没有重新加载时,它会在其他URL上工作,但是当我在" / foo / bar / bash"刷新页面时,它将不起作用。或任何其他网址。我通过映射任何404响应来修复此问题,以返回index.html页面。

将您的静态资源添加到initialization课程的Application方法:

bootstrap.addBundle(new AssetsBundle("/app", "/", "index.html", "static"));

将映射添加到您的run类的Application方法的新404页面中:

ErrorPageErrorHandler eph = new ErrorPageErrorHandler();
eph.addErrorPage(404, "/error/404");
environment.getApplicationContext().setErrorHandler(eph);

添加映射到/error/404

的资源
@GET
@Path("/error/404")
@Produces(MediaType.TEXT_HTML)
public Response error404() {
        // get html file from resources here...
        return Response.status(Response.Status.OK)
                .entity("<html>foo</html>")
                .build();
}

完成此操作后,我可以在&#34; / foo / bar / bash&#34;刷新页面。它仍然返回index.html文件。

答案 2 :(得分:0)

@jjbskir 有正确的答案。还有一些其他解决方案 hereherehere,但它们引入了不必要的依赖项。

这里有更完整的索引页资源:

@Path("/errorpage")
public class ErrorService {

    private static String indexPage;

    @GET
    @Produces(MediaType.TEXT_HTML)
    public Response get404() {

        if (indexPage == null) {
            InputStream in = this.getClass().getResourceAsStream("/assets/index.html");
            try (Scanner scanner = new Scanner(in, StandardCharsets.UTF_8.name())) {
                indexPage = scanner.useDelimiter("\\A").next();
            }
        }

        return Response.status(Response.Status.OK)
                .entity(indexPage)
                .build();
    }

}

它缓存索引页,因为它永远不应该在运行时改变。如果您在开发时使用此服务,您可能希望省略缓存。

像这样修改对 ErrorPageErrorHandler 的调用:

eph.addErrorPage(404, "/api/errorpage");

不要忘记 /api 前缀,如果这是你的 api 所在的位置,不要忘记注册资源。