Методы набора UIInput, не вызываемые при отправке страницы JSF с - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть простая Форма на моей странице JSF, которая выглядит следующим образом:

<html 
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
>
  <f:view>
    <h:head>
      <f:metadata>
        <f:viewParam name="cities" value="#{myBean.cities}" />
      </f:metadata>
    </h:head>
    <h:body>
      <h:form>
        <h:messages id="messages" />
        <h:selectManyCheckbox value="#{myBean.cities}" label="Select City" >
          <f:selectItems value="#{myBean.allCities}" />
        </p:selectManyCheckbox>
        <h:commandButton value="Submit">
          <f:ajax execute="@form" render="output"/>
        </h:commandButton>
      </h:form>
      <h:panelGroup id="output">
        Number of Selected Cities: #{myBean.cities.size()}
      </h:panelGroup>
    </h:body>
  </f:view>
</html>

Соответствующий компонент поддержки:

Со следующими методами компонента:

@Named
@RequestScoped
public class MyBean {
  private List<String> cities = new ArrayList<>();

  public List<String> getCities() {
    return cities;
  }

  public void setCities(List<String> cities) {
    this.cities = cities;
  }

  public List<String> getAllCities() {
    return new ArrayList<>(Arrays.asList(new String [] {
      "Los Angeles",
      "St. Louis",
      "San Francisco",
      "Dallas",
      }));
  }
}

Наблюдения:

  1. Я добавил ведение журнала для входа и выхода из методов getCities и setCities.Во время обновления страницы JSF вызывается метод getCities.Однако при отправке setCities никогда не вызывается.
  2. Я не получаю никаких ошибок или исключений в журнале консоли (javax.faces.PROJECT_STAGE установлен в DEVELOPMENT в web.xml).
  3. Ошибки не передаются в <h:messages/>
  4. . Методы set не вызываются ни для каких полей ввода формы.Страница ведет себя «нечетно».

Эта проблема похожа на проблему № 3 при принятом ответе от commandButton / commandLink / ajax action / listener метод не вызван или входное значение не установлено / не обновлено, однако у меня нет явной проблемы конвертации для <p:selectCheckboxMenu>.Согласно документации, он должен быть в состоянии справиться с List<String> отлично.

Так что, в дополнение к устранению очевидной проблемы, как мы можем сделать так, чтобы любые ошибки, связанные с этим, были видны, а не имели этот тип молчаниянеудачи?

1 Ответ

0 голосов
/ 20 февраля 2019

Короче говоря, <f:viewParam> пока не поддерживает список значений .

Подпись свойства cities: List<String>.

Обратите внимание, чтокогда мы пытаемся передать параметр для cities (добавить ?cities=Dallas в конец URL-адреса запроса), мы неожиданно получаем соответствующую ошибку преобразования в <h:messages/>, заявляя:

ПреобразованиеОшибка установки значения «Даллас» для «нулевого конвертера».

Также в соответствии с ссылками на посты, мы также должны включать сообщения для обновлений AJAX:

    <h:commandButton value="Submit">
      <f:ajax execute="@form" render="output"/>
      <f:ajax execute="@form" render="messages"/>
    </h:commandButton>

При выполнении этого,не во время первого посещения, но, по крайней мере, при отправке мы получаем соответствующую ошибку:

Значение параметра «Ошибка преобразования» для «нулевого конвертера».

Яне знаете, почему <f:viewParam> нужно устанавливать во время отправки в стиле ajax?

Чтобы решить, вы можете либо предоставить <f:converter>, либо предоставить дополнительный метод получения / установки, который обрабатывает установку / получениетип Array или List, основанный на String.

Выбор быстрого решениядалее мы можем изменить <f:viewParam> следующим образом:

<f:viewParam name="cities" value="#{myBean.citiesCsv}" />

В то время как для поддерживающего компонента мы добавим следующий метод:

  public void setCitiesCsv(String csv) {
    if (csv.isEmpty()) {
      cities = new ArrayList<>();
    } else {
      cities = 
         Stream.of(csv.split(","))
           .collect(Collectors.toCollection(ArrayList<String>::new));
    }
  }

Для повторных таких попыток нам, вероятно, следует рассмотретьвместо этого следует использовать соответствующий конвертер, который мы можем создать для простых преобразований CSV, если он соответствует нашей цели.

Похожие записи

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