Подтвердить что ты не робот

Проверка JSF в фазе действия

У нас есть веб-приложение на основе JSF, которое передает данные входной формы в веб-службу, а затем отображает ответ, предоставленный веб-службой.

Это веб-служба, которая проверяет входные данные, введенные пользователем. Я не уверен, как мы можем использовать JSF validation здесь. По моему пониманию JSF проверяет отдельные компоненты в представлении. Но это будет очень дорогостоящая операция, чтобы каждый раз обращаться к веб-сервису.

Вместо этого, когда пользователь отправляет форму, мы пропускаем все проверки, делаем запрос веб-службы в методе действий. На основе ответа веб-службы мы можем программным образом сказать, что конкретный компонент пользовательского интерфейса недействителен?

Не могли бы вы предложить свое предложение по этому поводу?

Окружающая среда: -

JSF 2.0
WebSphere Application Server 8.5
4b9b3361

Ответ 1

На основе ответа веб-службы мы можем программным образом сказать, что конкретный компонент пользовательского интерфейса недействителен?

Да, вы можете сделать это, вызвав UIInput#setValid(), передав false. Здесь полный фрагмент:

FacesContext context = FacesContext.getCurrentInstance();
UIInput input = (UIInput) context.getViewRoot().findComponent("form:input");
input.setValid(false);
context.addMessage(input.getClientId(context), message);
context.validationFailed();

FacesContext#validationFailed() не нужно вызывать на основе ввода. Кстати,

Ответ 2

Посмотрите этот учебник - раздел "Проверка вручную".

Вероятно, это то, что вы пытаетесь выполнить.

Ручная проверка

  • Используйте строковые свойства для bean (используйте блоки try/catch для обработки незаконных данных)
  • Сделайте проверку в методах setter и/или контроллере действий
  • Возвращает null для отображения формы.
  • Создание пользовательских сообщений об ошибках и сохранение в FacesMessage
  • Используйте h: сообщения для отображения списка сообщений об ошибках (если сообщений нет, это ничего не выводит)

Например, в bean:

public void setBidAmount(String bidAmount) {
    this.bidAmount = bidAmount;
    try {
        numericBidAmount = Double.parseDouble(bidAmount);
    } catch(NumberFormatException nfe) {}
}

И в методе действий:

public String doBid() {
    FacesContext context = FacesContext.getCurrentInstance();
    if (getNumericBidAmount() <= 0.10) {
        context.addMessage(null, 
        new FacesMessage("Bid amount must be at least $0.10."));
    }
    ...
    if (context.getMessageList().size() > 0) {
        return(null);
    } else {
        doBusinessLogicForValidData();
        return("show-bid1");
    }
}