Переадресация страницы ошибок 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);