我有一个 Quarkus 应用程序,它全部打包了一个 Angular SPA(捆绑在 JAR 中)。 Quarkus 提供后端 API 路由供前端使用。 Angular 应用程序构建被复制到META-INF/resources
构建 Quarkus 应用程序时目标中的路径。
我没有使用 JAX-RS 来注册我的路线。相反,我直接以编程方式在 Vertx 路由器上注册它们fun onRouterReady(@Observes router: Router)
method.
我希望将任何无法识别的路由(无论是作为 Vertx 注册的路由还是作为静态资源)重定向到index.html
这样我的 Angular 应用程序就可以从其所有路由加载。不幸的是我无法找到任何方法来做到这一点。
我不知道 Quarkus 的所有路由是如何运作的。我怀疑 Quarkus 本身正在使用 Servlet(或者可能是 Vertx)注册一些路由,因为index.html
已在根上正确提供服务,但我的身份验证根可以防止在未经身份验证的情况下加载。
我尝试了通过搜索找到的各种东西,例如:
router.route("/*").handler(StaticHandler.create())
router.route().handler({ context: RoutingContext ->
context.reroute("index.html)
})
其中的想法是创建一个静态处理程序,然后是一个包罗万象的处理程序,它将重写请求index.html
这样它就会被静态处理程序捕获,但这只会导致无限循环(静态处理程序似乎无法找到index.html
).
我还尝试通过 JAX-RS 添加过滤器(我想避免),但这也不起作用。
必须有某种方法来设置它,我确信 Quarkus 代码确实在某个地方做了,但我找不到它。任何想法都非常感激。
你需要观察Router
在应用程序范围类中的某处并设置 404 错误处理程序以重定向到index.html
public void init(@Observes Router router) {
router.errorHandler(404, routingContext -> {
routingContext.response().setStatusCode(302).putHeader("Location", "/index.html").end();
});
}
PS使用routingContext.reroute("index.html");
也可以工作,但它会保持原来的路径(例如你写的/testabc
,它将显示您的 html 文件,但路径不会/index.html
)。如果您确实需要这个,请将其替换为您的选项errorHandler
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)