неправильное oldValue и newValue в valueChangeListener при использовании его вместе с валидатором на странице JSF

Я использую vlaidator и valuechangeListener в поле h: inputText, подобное этому.

<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>

Я получаю одно и то же старое значение и новое значение в моем прослушивателе значений, когда я меняю поле ввода. Эта проблема исчезает, когда я удаляю валидатор, я получаю правильное старое значение и новое значение в valuechangeListener, когда я удаляю валидатор.

Что здесь происходит, вы хоть представляете?

и вот метод валидатора

    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) {

    }

}

person Yashar    schedule 12.03.2013    source источник
comment
Можете показать код валидатора? Потому что, если валидатор запускается до изменений и не проверяется, он вернется к старым значениям.   -  person Lyrion    schedule 12.03.2013
comment
И вы уверены, что данные, которые вы вводите в inputtext, верны?   -  person Lyrion    schedule 12.03.2013


Ответы (1)


Мне удалось решить проблему :), вот история:

на самом деле до достижения valueChangeListener целевой компонент все еще имеет свое старое значение. после запуска valueChangeListener значение компонента изменится на вновь введенное значение.

Поскольку валидатор запускается до valueChangeListener , любые изменения значения компонента в методе валидатора повлияют на oldValue в методе Listener.

В моем валидаторе я устанавливаю значение компонента с новым введенным значением (из аргумента «значение объекта» класса валидатора), поэтому это приводит к получению того же старого значения и нового значения в прослушивателе.

person Yashar    schedule 13.03.2013