java - 当 valueChangeListener 与 JSF 页面中的 validator 一起使用时,它的 oldValue 和 newValue 错误

标签 java jsf validation valuechangelistener

我在 h:inputText 字段中使用 vlaidator 和 valuechangeListener,如下所示。

<h:inputText id="quantityInput" required="true"
validator="#{CartController.validateQuantity}"
value="#{cartLine.quantity}" size="6" maxlength="15"
styleClass="numeric"
onchange='updateAndSubmit("#{CartController.rowIndex +1}", "tabs_root:updatedRow")'
onkeyup='checkEnter(event,"#{CartController.rowIndex +1}", "tabs_root:updatedRow")'
style="margin-right:0.4em"
tabindex="#{CartController.tabIndex}"
valueChangeListener="#{CartController.quantityListener}">
<rd:convertNumber
    maxFractionDigits="#{CartController.noOfQuantityDecimals}"
    minFractionDigits="#{CartController.noOfQuantityDecimals}" />
</h:inputText>

当我更改 inputText 框时,我在 valuechangeListener 中得到相同的 oldValue 和 newvalue。当我删除 validator 时,这个问题就消失了,当我删除 validator 时,我在 valuechangeListener 中获得了正确的 oldValue 和新值。

这是怎么回事,你知道吗?

这是 validator 方法

    public void validateQuantity(FacesContext facesContext,
        UIComponent component, Object value) throws ValidatorException,
        Exception {

    try {
        if (isCurrentRowItem()) {
            int quantityValidationResult = quantityControl(value,
                    getCurrentGoods());
            if (quantityValidationResult != QUANTITY_OK) {

                setViewErrorColumn(true);
                FacesMessage msg = new FacesMessage();
                if (quantityValidationResult == QUANTITY_TO_LOW) {
                    String felTextMiQuant = Text.get(
                            TextProperties.ANGIVENKVANTITETMINDREBESTKVANT,
                            getApUserData().getUser().getCultureSetting());
                    msg.setSummary(felTextMiQuant + " " + minQuantity);
                    getActiveCartAndTemplateTab().getErrorList().put(
                            new Integer(getRowIndex()), msg.getDetail());
                } else {
                    String felTextMuQuant = Text
                            .get(TextProperties.ANGIVENKVANTITETEJTILLATENMULTIPEL,
                                    getApUserData().getUser()
                                            .getCultureSetting());
                    msg.setSummary(felTextMuQuant + " " + multipleQuantity);
                    getActiveCartAndTemplateTab().getErrorList().put(
                            new Integer(getRowIndex()), msg.getDetail());
                }
                // Activate the previous tab, the one containing the errors,
                // in case the user tries to activate another
                if (cartAndTemplateController != null)
                    cartAndTemplateController
                            .setActiveTab(cartAndTemplateController
                                    .getActiveTab());
                throw new ValidatorException(msg);
            } else {

                // if we don't set here it will be impossible to correct more then one error
                double valueAsDouble;
                Line line = (Line) getCartEntity()
                        .getLines(getApUserData()).get(validatorCounter);

                if (value instanceof Long) {
                    valueAsDouble = ((Long) value).doubleValue();
                }

                else if (value instanceof String){
                    valueAsDouble = Double.parseDouble((String) value);
                }

                else {
                    valueAsDouble = (Double) value;
                }
                    line.setQuantity(getApUserData(), valueAsDouble);
            }
            validatorCounter++;
        }
    } catch (IllegalArgumentException e) {

    }

}

最佳答案

我设法解决了这个问题:),这是故事:

实际上在到达 valueChangeListener 之前,目标组件仍然有其 oldValue。 运行 valueChangeListener 后,组件的值将更改为新输入的值。

由于 validator 在 valueChangeListener 之前运行,因此 validator 方法中组件值的任何更改都会影响 Listener 方法中的 oldValue。

在我的 validator 中,我使用新输入的值(来自 validator 类的“对象值”参数)设置组件的值,因此它会导致在监听器中获得相同的旧值和新值。

关于java - 当 valueChangeListener 与 JSF 页面中的 validator 一起使用时,它的 oldValue 和 newValue 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15356681/

相关文章:

java - 将 InputStream 内包含的 json diff 结果分离到 Java 中的映射中

java - 如何处理从嵌套 ArrayList 获取整数值并将其添加到列表

java - 如何将值从 session bean 传递到 JSF inputText?

asp.net - 选择性验证

forms - 即使某些字段正确, Bootstrap 验证程序也会将整个表单标记为红色

java - 查找 n 个字母的所有排列的算法

java - 在 Tomcat 7 中使用 Tomcat JDBC 连接池的问题

javascript - JSF 1.2 文本到 Javascript 文本。如何转义反斜杠

jsf - @FacesValidator 和 @FacesConverter 中的 EJB 和 CDI 注入(inject)点无法通过较新版本的 JSF 中的 OmniFaces 工作

angular - 在 Angular Reactive Forms 中的 FormGroup 实例上设置错误无法按预期工作