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