Nano Hash - криптовалюты, майнинг, программирование

Необязательные старые значения JSF возвращаются после их очистки

Я использую JSF, PrimeFaces 3.2, Omnifaces 1.1, JBoss AS 7.1.1, Final, Mojarra 2.1.7.

У меня есть форма с двумя числовыми полями, оба из которых не требуются, например:

<h:form>
    <p:inputText id="num1" value="#{bean.field1}"/>
    <p:inputText id="num2" value="#{bean.field2}"/>
<p:commandButton ... ajax="true" />
</h:form>

Я также настроил OmniFaces ResetInputAjaxActionListener на Faces-config.

Свойства bean-компонента field1 и field2 являются целыми числами.

Теперь проблема в том, что если я ввожу, скажем, 123 на num1 и ввожу 345 на num2 и нажимаю OK, все в порядке. Если я затем удалю 123 из num1 и поставлю abc на num2. Затем отображается ошибка проверки (конверсии), но возвращается 123!

Если я сделаю их обоих required=true, тогда все будет хорошо.

Есть ли способ заставить это работать с необязательными полями?


Ответы:


1

Это специфическая проблема Мохарры. Поле, привязанное к Integer, неявно преобразуется IntegerConverter, который преобразует отправленное пустое строковое значение в null и устанавливает его как таковое в локальном значении компонента.

Когда форма повторно отображается после отправки, JSF сначала проверяет, не является ли отправленное значение нулевым, а затем отображает его, иначе, если локальное значение не является нулевым, затем отображает его, иначе отображает значение модели. Поскольку локальное значение равно null, вместо него отображается значение модели. Это действительно нежелательное поведение, о котором сообщалось несколько раз:

Это можно исправить, переопределив UIInput#getValue() следующим образом:

public Object getValue() {
    return isLocalValueSet() ? getLocalValue() : super.getValue();
}

MyFaces уже делает это правильно. Я повторно сообщил об этой проблеме, которая в итоге оказалась спецификация 566 (обновление и, наконец, исправлено в Mojarra 2.2.0 и перенесено в 2.1.21).

Между тем, самый простой способ обойти это, принимая во внимание сторонние библиотеки компонентов с их собственными средствами визуализации, такими как PrimeFaces, — это скопировать файл исходного кода класса javax.faces.component.UIInput прямо в исходную папку вашего проекта, а затем добавить желаемый метод UIInput#getValue(). Да, неуклюжее исправление, но на самом деле нет лучшего способа, поскольку причина проблемы кроется глубоко в самом JSF API.

OmniFaces ResetInputAjaxActionListener служит совершенно другой цели и не предназначен/не подходит для решения этой проблемы. Предполагается очистить состояние входных компонентов, у которых значение компонента не представлено, но сам компонент перерендерен в ajax.

11.10.2012
  • Я забыл упомянуть, что для параметра javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL установлено значение false 11.10.2012
  • Правильно, это вызвано неявным IntegerConverter, который преобразует "" в null (при условии, что эти поля привязаны к Integer) 11.10.2012
  • Да, они привязаны к Integer. Так что это не должно происходить для строк? 11.10.2012
  • Если нет чего-то еще, это происходит и для строк. 11.10.2012
  • Я смог обойти эту проблему для строк, написав собственный преобразователь для java.lang.String, который устанавливает нулевые значения в пустые строки. Но для Integer (и Date) это более сложная задача. Любые идеи? 11.10.2012
  • Извините, я не могу воспроизвести это для строк. Смотрите обновленный ответ для правильного исправления. 11.10.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..