Как «выкинуть» ошибку JSF2 404? - PullRequest
12 голосов
/ 04 февраля 2011

Допустим, у меня есть приложение, которое управляет пользователями.Вы можете добавить нового пользователя, удалить его, отредактировать детали и т. Д. Каждый пользователь имеет свой идентификатор и имеет страницу сведений об URL-адресе, например:

..../user/detail.jsf?id=123

Что же произойдет, если пользователя с идентификатором 123 не существует?Я думаю, что естественная реакция была бы стандартной ошибкой 404.Точно так же, как и в случае опечатки в URL (например, /user/dtail.jsf).Таким образом, вопрос: есть ли такой метод?

Или, может быть, эта реакция (404) уместна?

Спасибо.

Ответы [ 3 ]

14 голосов
/ 04 февраля 2011

Просто присоедините валидатор к параметру представления id, и если проверка не удалась, установите в ответ код ошибки 404.

например,

Рассмотрите этот простой Facelet:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

    <f:metadata>
        <f:viewParam id="id" name="id" value="#{myBean.id}" validator="#{myBean.validate}"/>
    </f:metadata>

    <h:body>

        <h:outputText value="#{myBean.id}"/>

    </h:body>

</html>

И следующий бобовый бэк:

@ManagedBean
@ViewScoped
public class MyBean {

    private Long id;

    public void validate(FacesContext context, UIComponent component, Object object) {
        // Do some validation
        // And if failed:
        context.getExternalContext().setResponseStatus(404);
        context.responseComplete();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}
1 голос
/ 08 марта 2012

Как уже упоминалось, вы можете получить контекст из управляемого компонента. Я попробовал подход с использованием валидатора, но для меня это было неприменимо, так как я использовал два параметра для инициализации моего компонента, и я хочу выбросить 404. Для меня .setResponseStatus не выбросил страницу 404. Просто дал неинформативную страницу браузера. Поэтому вместо этого я использовал responseSendError.

1 голос
/ 04 апреля 2011

(я закончил здесь поиском чего-то похожего, но вот еще один шаблон, который я использовал для аналогичной проблемы)

Ответ Validation / ExternalContext выше - очень хороший способ справиться с этимв качестве альтернативы (поскольку вы уже находитесь внутри контекста) вы можете обработать ошибку при разборе параметров из запроса и обработать ее внутренне.Я думаю, это скорее то, как вы хотите справиться с этим в своем потоке, чем «вот лучшее решение»

//Inside "SomeManagedBean"
  public String getParam()
  {
    String value = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("key");
    if(value == null)
      return "key not Exist";
    else
      return value;

  }

// Источник JSF 2.0 (что-то.xhtml) ... ...

Я думаю, что выше, как правило, легче работать внутри фреймворка (вам не нужно отправлять на страницу с ошибкой и нарушать поток), но на самом деле это просто архитектурное решение.Оба решения похожи, это просто вопрос нарушения потока или внутренней обработки.В любом случае ExternalContext - ваш друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...