Не удается очистить ввод данных после отклонения - PullRequest
1 голос
/ 22 августа 2011

У меня возникают проблемы при очистке поля ввода формы с использованием проверки бинов при проверке ограничения. У меня есть форма ввода, которая не может превышать 50 символов, поэтому я хочу отобразить сообщение и очистить поле, если пользователь взломает страницу и превысит лимит символов. Я попытался просто очистить связанное поле, но это не работает. Независимо от того, что я делаю, кэшированное значение (значение, которое было отклонено проверкой bean-компонента) всегда остается в поле ввода. Мой код выглядит следующим образом:

JSP:

<form:form action="submit.do" method="POST" commandName="obj">
    <form:input id="field1" path="field1" cssClass="box" size="50" maxlength="50"/>
    <p><input class="action" type="submit" name="enter.x" value="Submit" /></p>
</form:form>

МОДЕЛЬ:

public class Obj{
    @Length(max=50, message="Length invalid.")
    private String field1;

    // Getter and setter
}

CONTROLLER:

@SessionAttributes ({"obj"}) 
public class NavController{ 

    @RequestMapping(value="show.do", method=RequestMethod.POST)
    public ModelAndView submitUpdateObj(
            HttpServletRequest request
            , HttpServletResponse response
            ,@ModelAttribute
            @Valid
            Obj obj
            ,BindingResult result
    ) {
        ModelAndView mav = new ModelAndView();

        if(result.hasErrors()){
            // clear bound value
            obj.setField1("");

            // add error messages to request
            mav.setViewName("update");
        }else{
            mav.setViewName("register");
        }


        return mav;
    }

}

Я могу заставить это работать, создав собственный Validator и создав / вызывая DataBinder в контроллере, но я пытаюсь избежать программной проверки этого объекта (без вложенной логики if / else). Похоже, что как только средство проверки бинов отклоняет поле, его невозможно очистить. Вы должны очистить поле, прежде чем оно будет отклонено (именно поэтому будет работать пользовательский метод проверки). Используя описанный выше метод, проверка / отклонение происходит до того, как я могу взять объект и не могу получить значение кэшированного поля. Любая помощь будет принята с благодарностью.

* ОБНОВЛЕНИЕ * Следующая ссылка содержит очень похожую проблему:

http://forum.springsource.org/showthread.php?50762-Clear-form-field-after-failed-validation

Предлагаемое решение - именно то, что я предпочел бы НЕ делать.

Ответы [ 2 ]

0 голосов
/ 20 августа 2015

Просто наткнулся на ту же проблему и не смог найти правильного решения. Я следовал ниже обходного пути:

  • Создать новый объект. В вашем случае Obj newObj = new Obj();
  • Скопируйте все свойства из obj в newObj, используя пружину BeanUtils.copyProperties
  • Установите newObj в ModelAndView.

Нашли ли вы лучшее решение?

0 голосов
/ 22 августа 2011

Вы забыли установить объект в модели и представлении.

Добавить эту строку

modelAndView.getModelMap().addAttribute("obj", obj);

после obj.setField1("");

чуть более читабельно:

@RequestMapping(value="show.do", method=RequestMethod.POST)
public ModelAndView submitUpdateObj(@ModelAttribute @Valid Obj obj,
      BindingResult result) {

    if(result.hasErrors()){
        // clear bound value
        obj.setField1("");
        return new ModelAndView("update","obj",obj);
    }else{
        return new ModelAndView("register");
    }
}
...