Переадресация страницы ошибок Richfaces с помощью Gatein, jboss 5.1.0 ga, моста с портлетами и моих ошибок

Я знаю, что есть много похожих вопросов на те же / похожие темы, но я не смог применить ни одно из решений моей проблемы.

Я хочу перенаправить пользователя на пользовательскую страницу ошибки всякий раз, когда возникает исключение при отображении страницы портлета. почему выдается исключение при отображении страницы? Это потому, что в фоновом режиме мы добавляем его, чтобы дать пользователю некоторую полезную информацию, разработанную таким образом, и в ближайшее время она не будет изменена, поэтому я намерен сохранить ее в таком виде.

Я полагаю, что было бы лучше, если бы я привел примеры: это простой портлет, в котором я предоставляю имя пользователя и нажимаю кнопку ">>", чтобы получить некоторую информацию об этом пользователе, в предыдущей реализации его работа работала нормально, см. Второе изображение..

Вторая картинка:

как вы можете видеть, верна верстка ""(вот как это выглядело) страница ошибки просто заменила содержимое портлета своим собственным содержимым и сообщением об ошибке, поэтому мы не смогли получить никакой информации о пользователе. Все идет нормально.

Теперь давайте рассмотрим проблемный случай: мы обновили jboss с 4.2.3 до 5.1.0 га, и теперь GateIn выходит на игровую площадку. Также для создания этого представления портлетов использовались старые jar-файлы, теперь все они обновлены до более новых. Такие как:

(org.richfaces.framework) Richfaces-api 3.3.3-final, 
(org.richfaces.framework) Richfaces-impl 3.3.3-final,
(org.richfaces.framework) Richfaces-ui 3.3.3-final,
(com.sun.faces) jsf-api 2.2.14,
(com.sun.faces) jsf-impl 2.2.14,
(javax-servlet) servlet-api 2.5,
(javax-servlet) jstl 1.2

Gatein version: 3.4

и сам gatein использует jsr168-совместимые jars + у нас есть версия jsf 1.2 (в этой версии используются теги).

Проблемный случай: как вы видите, портлет, который мы хотим получить, содержит некоторую информацию о пользователе, которая разбита и объединена в подробный портлет домена. который выглядит как суп.

Код, который генерирует этот беспорядок, также принадлежит нам. который работал правильно один раз, однако теперь каким-то образом разрушает весь макет.

Позвольте мне показать вам код, который отображает представления:

    public void renderView(FacesContext context, UIViewRoot viewToRender) throws java.io.IOException, javax.faces.FacesException{
    try {
        super.renderView(context, viewToRender);
    }catch(FacesException e){         

        Application application = context.getApplication();
        ViewHandler viewhandler = application.getViewHandler();
        PortletRequest request = (PortletRequest)context.getExternalContext().getRequest();
        PortletConfig config = (PortletConfig)request.getAttribute(PortletConstants.PORTLET_CONFIG);
        String errorView = config.getInitParameter(PortletConstants.PORTLET_FACES_ERROR_VIEW);

        if(errorView == null || errorView.matches("")){
            errorView = ProvPortletViewHandler.DEFAULT_FACES_ERROR_VIEW;                       
        }

        Throwable cause = e.getCause();
        FacesMessage fm= findProvisioningException(cause);
        if(fm == null)
        {             
            request.setAttribute("ErrorMessage", "Unknown Error occured");
        }
        else
        {
            request.setAttribute("ErrorMessage", fm.getSummary());
        } 

        viewToRender = viewhandler.createView(context,errorView);         
        context.setViewRoot(viewToRender);             
        viewhandler.renderView(context, viewToRender);

        PortletSession objSes = (PortletSession)context.getExternalContext().getSession(false);
        objSes.invalidate();
    }
}

В этом фрагменте кода вы можете видеть, что есть super.renderView(context, viewToRender);

Он проходит весь путь до сервисов и делает сервисный звонок. сервисные вызовы возвращают исключение, что этот пользователь не имеет информации в БД. и это исключение преобразуется в FacesException на дороге (мы делаем это).

Проблема не является исключением или преобразованием его в FacesException.

Проблема возникает в этой части

 viewToRender = viewhandler.createView(context,errorView);         
 context.setViewRoot(viewToRender);             
 viewhandler.renderView(context, viewToRender);

насколько мы отлажены. Мы как-то верим, что старое представление, которое было частично отображено из-за исключения, не может быть заменено представлением с ошибкой.

Но что могло бы сделать это, если бы это работало ранее. мы не изменили эту часть кода.

Достаточно ли этой информации, чтобы составить представление о проблеме? Ребята, вам нужны подробности? Как вы думаете, что мы делаем здесь не так?

С уважением

1 ответ

Решение

После тщательного изучения видно, что когда приходит запрос, его ответ создается и заполняется на этом этапе. В нем уже есть HTML-контент. При попытке перенаправить новый файл JSP, он добавляет новые элементы HTML в ответ. Таким образом, элементы HTML внутри ответа становятся неясными для Gate-in. Чтобы избежать этой проблемы, достаточно сбросить ответ. Это можно сделать сбросом буфера ответов, что можно увидеть в коде;

     viewToRender = viewhandler.createView(context, errorView);
     context.setViewRoot(viewToRender);
     **((javax.portlet.RenderResponse) context.getExternalContext().getResponse()).resetBuffer();**
     viewhandler.renderView(context, viewToRender);
Другие вопросы по тегам