2016-05-24 2 views
1

У меня есть jsp с формой struts2, которая имеет виджет ввода номера типа, если я опорожню этот виджет, а затем отправлю в форму в struts (до моего метода проверки) I получить это в журнале отладки:Как проверить ввод из формы в struts2 action

19:10:30,734 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34] Developer Notification (set struts.devMode to false to disable this message): 
Unexpected Exception caught setting 'someDto.intCol' on 'class mypackage.MyAction: Error setting expression 'someDto.intCol' with value ['', ] 

Я хотел бы, чтобы захватить это исключение (далее «Неожиданное исключением») сделать что-то, а затем в валидатор (в действии) установке ошибка с addFieldError из класса ActionSupport,

Спасибо за помощь :)

EDIT:

Класс DTO:

public class SomeDto() { 

    private Integer intCol; //{with getters&setters} 

Проблема заключается в том, что когда пользователь очистить вход в форме (в СПЯ), распорки пытаются преобразовать [ «»] (или строка пуста в других словах) в Integer с классом ParametersInterceptor (например, в строке журнала).

Итак, у dto есть геттеры и сеттеры.

+0

Какой тип данных переменной intCol? –

+0

Для этого вам нужен другой перехватчик params. Вам нужно выложить MCVE, потому что без него вопрос не в тему. –

+0

Вам не хватает установщика –

ответ

1

Вы можете использовать «ParameterAware» перехватчик:

@Override 
public void setParameters(Map<String, String[]> parameters) { 
    System.out.println("parameters: " + parameters); 

    if (parameters.get("someDto.intCol")[0].length() == 0) { 
     parameters.put("someDto.intCol", new String[]{"0"}); 
    } 
} 

Это поймает параметров из СПЯ и если если пусто будет положить 0 вместо,

С уважением.

0

Как Упоминание @RomanC Если посмотреть на ParametersInterceptor вокруг линии 299, вы найдете этот цикл:

for (Map.Entry<String, Object> entry : acceptableParameters.entrySet()) { 
      String name = entry.getKey(); 
      Object value = entry.getValue(); 
      try { 
       newStack.setParameter(name, value); 
      } catch (RuntimeException e) { 
       if (devMode) { 
        notifyDeveloperParameterException(action, name, e.getMessage()); 
       } 
      } 
     } 

Вот где исключение происходит, и вы увидите сообщение журнала. Вы можете расширить ParametersInterceptor и делать то, что хотите. Например, вы можете поместить некоторый параметр в ValueStack, а затем использовать его в себе action.

Но мне кажется очень сложным. Вы можете найти другой способ решить свою проблему, а не напрямую обращаться с этим кодом перехватчика. Например, преобразование intCol в String и использование валидаторов.

Смежные вопросы