ConversionErrorInterceptor выдает ошибку преобразования во время выхода / отмены (Struts 2) - PullRequest
0 голосов
/ 10 мая 2011

Сценарий проблемы такой

1) Мы отображаем значения поля распорок в dtos. Dtos содержат целочисленные поля, которые снова отображаются на экране.

2) Теперь я ввожу неверное значение, которое дает ошибку преобразования для этого целочисленного поля.

3) В тот момент, когда я решаю выйти из страницы (то есть нажмите «Отмена»), я получаю ошибку преобразования. Это потому, что StrutsConversionErrorInterceptor вызывается каждый раз.

Есть ли способ, которым я могу пропустить strutsConversionErrorInterceptor, когда я вызываю определенный метод, как мы можем пропустить проверку, используя excludeMethods

Ответы [ 3 ]

0 голосов
/ 17 июня 2011

Используйте этот код для переопределения Struts. StrutsConversionErrorInterceptor ...

public class MyConversionErrorInterceptor extends AbstractInterceptor {

    private static final long serialVersionUID = 1L;

    public static final String ORIGINAL_PROPERTY_OVERRIDE = "original.property.override";

    protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
         ValueStack stack = invocation.getStack();

            try {
                stack.push(value);

                return "'" + stack.findValue("top", String.class) + "'";
            } finally {
                stack.pop();
            }
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {

        ActionContext invocationContext = invocation.getInvocationContext();
        Map<String, Object> conversionErrors = invocationContext.getConversionErrors();
        ValueStack stack = invocationContext.getValueStack();

        HashMap<Object, Object> fakie = null;

        BaseAction baseAction = (BaseAction) invocation.getAction();
        String buttonName = baseAction.getButtonName();

        for (Map.Entry<String, Object> entry : conversionErrors.entrySet()) {
            String propertyName = entry.getKey();
            Object value = entry.getValue();

            if (shouldAddError(propertyName, value)) {
                String message = XWorkConverter.getConversionErrorMessage(propertyName, stack);

                Object action = invocation.getAction();
                if (action instanceof ValidationAware) {
                    ValidationAware va = (ValidationAware) action;
                      if(buttonName.equalsIgnoreCas("Next")){
                          va.addFieldError(propertyName, message);
                      }
                }

                if (fakie == null) {
                    fakie = new HashMap<Object, Object>();
                }
                 if(buttonName.equalsIgnoreCas("Next")){
                     fakie.put(propertyName, getOverrideExpr(invocation, value));
                 }
            }
        }

        if (fakie != null) {
            // if there were some errors, put the original (fake) values in
            // place right before the result
            stack.getContext().put(ORIGINAL_PROPERTY_OVERRIDE, fakie);
            invocation.addPreResultListener(new PreResultListener() {
                public void beforeResult(ActionInvocation invocation, String resultCode) {
                    Map<Object, Object> fakie = (Map<Object, Object>) invocation.getInvocationContext().get(ORIGINAL_PROPERTY_OVERRIDE);

                    if (fakie != null) {
                        invocation.getStack().setExprOverrides(fakie);
                    }
                }
            });
        }

        return invocation.invoke();
    }

    protected boolean shouldAddError(String propertyName, Object value) {

        if (value == null) {
            return false;
        }

        if ("".equals(value)) {
            return false;
        }

        if (value instanceof String[]) {
            String[] array = (String[]) value;

            if (array.length == 0) {
                return false;
            }

            if (array.length > 1) {
                return true;
            }

            String str = array[0];

            if ("".equals(str)) {
                return false;
            }
        }

        return true;

    }

}

Вы можете указать имена кнопок, для которых вы хотите запустить проверку. В приведенном выше коде я использовал «Далее» в коде, который вы видите

если (buttonName.equalsIgnoreCas ( "Next"))

0 голосов
/ 29 сентября 2011

Это, кажется, лучший способ справиться с этим сценарием - использовать Conversion Validator. Repopulating Field upon conversion Error раздел очень полезен:

http://struts.apache.org/2.0.14/docs/conversion-validator.html

0 голосов
/ 10 мая 2011

Да, вы можете пропустить вызов перехватчика.

Просто удалите определение перехватчика из определения действия в файле struts.xml.то есть, удалить <interceptor-ref name="conversionError"/>

В основном этот перехватчик добавляет любую ошибку, найденную в карте ConversionErrors ActionContext, как ошибку поля (при условии, что действие реализует ValidationAware).Кроме того, любое поле, содержащее ошибку проверки, сохраняет свое первоначальное значение, так что любые последующие запросы этого значения возвращают исходное значение, а не значение в действии.Это важно, потому что если значение «abc» отправлено и не может быть преобразовано в int, мы хотим снова отобразить исходную строку («abc»), а не значение int (вероятно, 0, что не имеет большого смыслапользователю).

После того как вы удалили этот перехватчик, если распоркам не удалось сопоставить поле с параметром объекта (т. Е. От строки до int), он выдаст ошибку действия ввода результата.

...