Как ввести ввод в простые символы после ошибок проверки - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь ввести данные в виде данных (пример кода ниже).Действительно трудной частью решения этой проблемы является то, что я не могу воспроизвести ее.Это работает некоторое время с действительными сообщениями об ошибках, и я могу повторно ввести данные.Затем он застревает на некоторых плохих данных и игнорирует последующий ввод.Я знаю, что это вопрос, который был задан ранее.Я испробовал все решения в Как заполнить текстовое поле с помощью PrimeFaces AJAX после возникновения ошибок проверки? (которому 8 лет) и другие сообщения.

Одна проблема с некоторыми из«Сброс» решения после ошибки проверки, данные сбрасываются на исходные данные модели, и нет никаких признаков ошибки, и старые данные просто повторно.

Вот очень упрощенная версия моего xhtml имой валидаторОпять же, когда я запускаю это, это будет работать.(Мой настоящий xhtml явно более сложный).Затем после нескольких записей хороших и плохих данных, он застревает на некоторых плохих данных и прекращает обновление.Возможно, проблема в том, что данные находятся внутри таблицы данных.Если у кого-то есть решения, пожалуйста, дайте мне знать.Даже обходной путь в моей кнопке сброса будет в порядке на этом этапе.

<h:form id="swFormId">

<h:panelGrid columns="3">
    <h:outputText value="Simple"/>
    <p:commandButton id="submitId1" value="Submit" action="#{controller.submitAction}" update="@form">
        <!--<f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener"/>-->
    </p:commandButton>

    <p:commandButton value="Refresh" action="#{controller.refreshAction}" resetValues="true" update="@form"/>
</h:panelGrid>

<p:dataTable value="#{controller.swContainers}" var="swContainer" rows="5">
    <p:column headerText="Container">
        <p:outputLabel value="#{swContainer.containerNumber}"/>
    </p:column>

    <p:column headerText="Value">
        <p:inputText id="inputId" value="#{swContainer.currentSwLabel.phString}">
            <f:attribute name="aContainer" value="#{swContainer}"/>
            <f:validator validatorId="simpleValidator"/>
        </p:inputText>
        <h:message for="inputId" style="color:red"/>
    </p:column>
</p:dataTable>

Конвертер:

 @FacesValidator("simpleValidator")
 public class SimpleValidator implements Validator {

private static final Logger logger =    LoggerFactory.getLogger(SimpleValidator.class);

public SimpleValidator() {
}

@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    SwContainer aContainer = (SwContainer) component.getAttributes().get("aContainer");
    String message = null;
    Double phFloat = null;
    if (StringUtils.isEmpty(value+"")) {
        message = "value is required " ;
    } else {
        try {
            phFloat = Double.valueOf(value.toString());
        } catch (NumberFormatException e) {
            message = "phValue must be a number";

    } catch (Exception e) {
        message = e.toString() ;
    }
}
    logger.info("~ " + aContainer.getContainerNumber() + " value {" + value + "} message {" + message + "}");
    if (message == null) {
        logger.debug("value ok " + value +" " + aContainer.getContainerNumber());
        aContainer.getCurrentSwLabel().setPhValue(phFloat);
    } else {
        logger.debug("throwing ValidatorException for " + aContainer.getContainerNumber() + " message: " + message);
        throw new ValidatorException(new FacesMessage(message));
    }
  }
}

Я также попытался добавить следующее из omnifaces в мой Face-Config.xml

  <application>
    <action-listener>org.omnifaces.eventlistener.ResetInputAjaxActionListener</action-listener>
</application>

<</p>

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