一尘不染

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

jsp

我曾经只使用可以执行查询的Tomcat和JSP页面,然后将
查询结果分配给数组或对象,然后通过
响应将数据传递到客户端。

request.setAttribute("errorMessage", "this is error!!");
request.getRequestDispatcher("report.jsp").forward(request, response);

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

$ {errorMessage}

然后是“这是错误!” 消息将会显示。

我想对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......
   }

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

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)

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

客户端jsp期望错误msg变量具有一个值:

<b>${errorMessage}</b>

阅读 374

收藏
2020-06-10

共1个答案

一尘不染

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

throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);

还是毕竟是客户的错误:

throw new WebApplicationException(Response.Status.BAD_REQUEST);

在ClassCastException你面对的是由发生,因为这样
的出动request实际上不是servletcontainer-的实例
提供的实现(在这种特殊情况下,Tomcat的的一个或一个
Tomcat的叉)。毕竟,您不应该这样做。您正在开发
REST Web服务,而不是JSP / Servlet网站。这是两个不同的世界。

2020-06-10