我正在构建一个单页应用程序,它在客户端和后端执行所有它的html请求路由,它使用dropwizard提供一堆JSON服务。
基本上我无法在dropwizard中使用jetty为每个请求提供index.html服务,但以下路径除外:
/css
/i18n
/img
/js
/lib
/services
/templates
事实上,我在查找文档方面遇到了很多麻烦,这些文档告诉您如何设置任何http路由。 (我不是一个小家伙)。
这是我简单的yaml配置:`
http:
port: 8082
adminPort: 8083
rootPath: /service/*`
我需要添加什么才能实现这一目标。
由于
答案 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)
将您的静态资源添加到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 有正确的答案。还有一些其他解决方案 here 和 here 和 here,但它们引入了不必要的依赖项。
这里有更完整的索引页资源:
@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 所在的位置,不要忘记注册资源。