Я пытаюсь ввести данные в виде данных (пример кода ниже).Действительно трудной частью решения этой проблемы является то, что я не могу воспроизвести ее.Это работает некоторое время с действительными сообщениями об ошибках, и я могу повторно ввести данные.Затем он застревает на некоторых плохих данных и игнорирует последующий ввод.Я знаю, что это вопрос, который был задан ранее.Я испробовал все решения в Как заполнить текстовое поле с помощью 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>