Как перенаправить пользователя при выполнении определенного условия с помощью реализации REST JAX-RS? - PullRequest
2 голосов
/ 01 марта 2011

Раньше я просто использовал страницы 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 error будет иметь значение:

<b>${errorMessage}</b>

Ответы [ 2 ]

4 голосов
/ 01 марта 2011

Это не RESTful. Вам нужно добавить WebApplicationException с определенным кодом состояния, чтобы клиент понимал, что именно пошло не так. Например. когда это на самом деле ошибка сервера:

throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);

Или когда все-таки была ошибка клиента:

throw new WebApplicationException(Response.Status.BAD_REQUEST);

См. Также Определения кодов статуса HTTP для обзора.


Кстати, ClassCastException, с которым вы сталкиваетесь, происходит потому, что отправленный request на самом деле не является экземпляром реализации, предоставляемой сервлет-контейнером (в данном конкретном случае, Tomcat или Tomcat-fork) , В конце концов, вы не должны делать это таким образом. Вы разрабатываете веб-сервис REST, а не веб-сайт JSP / Servlet. Это два разных мира.

3 голосов
/ 20 июня 2012

Как упоминалось ранее, вам следует попробовать WebApplicationException.

Я полагаю, что это даст вам желаемый ответ:
Попробуйте:

        if(out.isEmpty()) {
             java.net.URI location = new java.net.URI("report.jsp");
             throw new WebApplicationException(Response.seeOther(location).build());
         }


...