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)
那不是宁静的。您需要抛出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 网站。这是两个不同的世界。
| 归档时间: |
|
| 查看次数: |
7928 次 |
| 最近记录: |