我曾经只使用可以执行查询的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>
那不是RESTful的。您需要抛出一个WebApplicationException带有特定状态码的代码,以便客户端了解到底出了什么问题。例如,实际上是服务器的错误:
WebApplicationException
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
还是毕竟是客户的错误:
throw new WebApplicationException(Response.Status.BAD_REQUEST);
另请参见HTTP状态代码定义以获取概述。
在ClassCastException你面对的是由发生,因为派遣的方式request其实不是servletcontainer提供的实现的实例(在这种特殊情况下,Tomcat的的一个或一个Tomcat叉)。毕竟,您不应该这样做。您正在开发REST Web服务,而不是JSP / Servlet网站。这是两个不同的世界。
ClassCastException
request