2013-04-13 2 views
0

Я сделал некоторое исследование о том, как это сделать, я нашел некоторые изолированные решения, но я не мог понять, как их сочетать и что путь является лучшей практикой. Я использую tomcat и jsf 2.x.ИсключениеHandling в JSF 2.x, доступ к SessionScoped управляемому bean-компоненту из другого и перенаправление

Сценарий: У меня есть сеансовый боб, mycontrollerA. Контроллер относится к myviewa.xhtml. После нажатия командыLink на viewA, действие mycontrollerA.doThis() было вызвано. В этом методе я хочу использовать try-catch, и если возникает исключение, я хочу перенаправить на мое представление отчета исключения exception.xhtml. Связанный контроллер ExceptionController имеет атрибут «сообщение», и я хочу установить соответствующее значение в myControllerA.

Проблемы: У меня возникла ошибка, если я попытаюсь захватить мой компонент exceptionController. Я предполагаю, что его просто нет, потому что он никогда не инициализировался. Я надеюсь, что существует общий способ захвата компонента SessionScoped из другого компонента SessionScoped, который обрабатывает это «создавать, если необходимо», из коробки. Более того, я думаю, что мой код перенаправления может быть улучшен.

Заранее спасибо.

public String doThis() { 
    try { 
     throw new RuntimeException("TestExc"); 
} catch (RuntimeException e) { 
    //ExceptionController exceptionController = (ExceptionController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("exceptionController"); 
    //exceptionController.setMessage("Fehlerinfo: " + e.getMessage()); 
    try { 
     FacesContext.getCurrentInstance().getExternalContext().redirect("exception.xhtml"); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
    return null; 
} 

@ManagedBean(name = "exceptionController") 
@SessionScoped 
public class ExceptionController { ... } 
+0

Прежде всего, существует ли какая-либо особая причина для того, чтобы этот компонент 'mycontrollerA' был' @ SessionScoped'? Я прошу, потому что, похоже, вы связываете его с определенным представлением, поэтому удобнее иметь аннотацию '@ ViewScoped'. Сказав это, вы можете ссылаться на компонент '@ SessionScoped' из' @ ViewScoped', используя аннотацию '@ ManagedProperty'. Но помните, что этот компонент не будет инициализирован, если вы этого не сделаете. –

ответ

1

Вы могли бы попытаться разрешить боб через ELResolver:

FacesContext fc = FacesContext.getCurrentInstance(); 
ELContext el = fc.getELContext(); 
ExceptionController exCtrl = (ExceptionController) el.getELResolver() 
    .getValue(el, null, "exceptionController"); 

Ваша проблема вероятно, что компонент не был создан раньше, и поэтому она еще не в сессии. С помощью подхода ELResolver он должен быть создан.

+0

Огромное спасибо Мичи, он работает! – Jochen

Смежные вопросы