使用“WebApplicationException”来重定向请求不是一个好主意。在 Jersey (2.4.1) 中,您应该能够通过正常的 servlet 方式重定向请求,(request.getServletContext().getRequestDispatcher().forward() 或只是 response.sendRedirect())
以下是 Jersey 处理请求的方式
org.glassfish.jersey.servlet.ServletContainer.service(HttpServletRequest request, HttpServletResponse response)
requestScope.runInScope
final ContainerResponse response = endpoint.apply(data)
methodHandler.invoke(resource, method, args);
Responder.process(ContainerResponse);
该methodHandler是您的 REST 服务类,方法是该服务类中的函数。
重定向页面的步骤变得严格
通过Jersey注入(@Context HttpServletRequest request,@Context HttpServletResponse response)在类字段或函数参数中获取(request,response)
调用 request.getServletContext().getRequestDispatcher() 以获取“转发”的调度程序或使用 Response.sendRedirect(url)
一旦您的应用程序被返回(只是 null),Jersey 将尝试在“Responder.process(ContainerResponse)”中处理结果。在这一步中,它将使用响应来设置状态(204 没有内容为您的 null 返回)。
所以这里的关键是你必须在从你的服务函数返回之前完成/关闭响应对象。否则,Jersey 可能会覆盖您的输出。
关于为什么“WebApplicationException”可以覆盖 Jersey 响应的小提示。这是因为 org.glassfish.jersey.server.ServerRuntime.mapException() 将使用“webApplicationException.getResponse()”作为返回响应结果。