如何使用 REST JAX-RS 实现在满足特定条件时重定向用户?

mas*_*san 2 java rest redirect jsp jax-rs

我过去只使用 Tomcat 和 JSP 页面来执行查询,然后将查询结果分配到数组或对象中,然后通过响应将该数据传递到客户端。

request.setAttribute("errorMessage", "this is error!!");
request.getRequestDispatcher("report.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)

在客户端 jsp 代码中,我可以执行以下操作:

${错误消息}

然后“这是错误!!” 消息就会出现。

我想对 REST JAX-RS GlassFish v3 做同样的事情。

    @Path("schedule/test")
    @POST
    @Consumes("application/x-www-form-urlencoded")
    @Produces("application/vnd.ms-excel")
    public Object tmpTest(String content) {
        try {

            //just my method to execute query and get result
            Vector out = (Vector)QueryManager.executeQuery;

            //if query result is empty, I want user to redirect to report.jsp page
            if(out.isEmpty()) {
                request.setAttribute("errorMessage", "This is error!!");
                request.getRequestDispatcher("report.jsp").forward(request, response);
                return null;
            }
        ....continue code......
   }
Run Code Online (Sandbox Code Playgroud)

这会导致我从未见过的神秘异常。

java.lang.ClassCastException: $Proxy109 cannot be cast to org.apache.catalina.core.ApplicationHttpRequest
            at org.apache.catalina.core.ApplicationHttpRequest.getRequestFacade(ApplicationHttpRequest.java:1001)
            at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:472)
            at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:379)
            at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:336)
            at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:314)
Run Code Online (Sandbox Code Playgroud)

那么如何将用户重定向到report.jsp 并传递“这是错误”之类的消息?

客户端 jsp 期望错误消息变量有一个值:

<b>${errorMessage}</b>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 5

那不是宁静的。您需要抛出WebApplicationException带有特定状态代码的 ,以便客户端了解到底出了什么问题。例如,当它实际上是服务器的错误时:

throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
Run Code Online (Sandbox Code Playgroud)

或者当客户犯了所有错误时:

throw new WebApplicationException(Response.Status.BAD_REQUEST);
Run Code Online (Sandbox Code Playgroud)

另请参阅HTTP 状态代码定义以获取概述。


ClassCastException顺便说一句,您所面临的情况是因为调度实际上request不是 servletcontainer 提供的实现的实例(在这种特殊情况下,是 Tomcat 或 Tomcat-fork 的实例)。毕竟,你不应该这样做。您正在开发 REST Web 服务,而不是 JSP/Servlet 网站。这是两个不同的世界。