Spring MVC 3 и возврат ошибок валидации на страницу из @Valid - PullRequest
0 голосов
/ 10 ноября 2011

Я устал. Я работал над сайтом Spring MVC в течение последних двух недель, и я обнаружил, что документация в лучшем случае вводит в заблуждение, и поэтому сейчас я прибегаю к просьбе о помощи. Оооочень ..... Пожалуйста, помогите!

Вопрос

Я пытаюсь выяснить, почему при приведенной ниже настройке ошибки проверки не отправляются обратно в представление, то есть различные теги frm:error(s) не показывают никаких ошибок. Я проверил аргумент BindingResult для сопоставления запроса POST с помощью отладки во время выполнения, и ошибки есть. Учитывая, что документация в этом отношении в лучшем случае расплывчатая, может ли кто-нибудь указать на мою неуместную точку с запятой или просветить меня, в чем секрет того, что мне не хватает, чтобы сообщить пользователю об ошибках проверки, чтобы сообщить им об их личных недостатках?

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

Имейте в виду, что я пытаюсь сохранить это чисто Spring MVC 3.0. Я был очень хорош с 2.5.6, но я почти не использовал аннотации, так что этот проект - такое же учебное упражнение, как и все остальное. Я хотел бы пойти с чисто 3.0 аннотациями и тому подобным, хотя мой мозг восстает из документации, которая высмеивает меня в моих снах и заставляет меня хотеть просто отбросить объект команды, установить HttpServletRequest в качестве моего единственного аргумента RequestMapping, и сделал с этим.

Стек:

Spring 3.0.6
Плитка 2.2.2
Glassfish 3.1.1

Код:

Spring app-servlet.xml

<context:component-scan base-package="com.facets.w101.almanac.spring"/>
<mvc:annotation-driven/>
... other stuff

Spring main.beandef.xml

<bean id="messageSource"
      class="org.springframework.context.support.ResourceBundleMessageSource"
      p:basename="messages" />
<bean id="userValidator" class="com.mycmpny.UserValidator" />
... other stuff

Код контроллера

@Resource(name="userValidator")
private UserValidator userVldr;

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setValidator(this.userVldr);
}


@RequestMapping(value = "/newuser", method = RequestMethod.GET)
public String newUserSetup(ModelMap model) {
    model.addAttribute("newUser", new User());
    return "newuser";
}

@RequestMapping(value = "/newuser", method = RequestMethod.POST)
public ModelAndView newUserSave(@ModelAttribute @Valid User user, BindingResult result) {
    ModelAndView mav = new ModelAndView("newuser");
    mav.addObject("newUser", user);
    if(result.hasErrors()) {
        return mav;
    }
    /* Code that saves user */
    return mav;
}

Код JSP

<frm:form method="POST" commandName="newUser">
<frm:errors path="*" cssClass="errorblock" element="div" />
<frm:label path="name">Name:</frm:label>
<frm:input path="name" id="userName" /><frm:errors path="name" /></td>
<frm:label path="type">User Type:</frm:label>
<frm:select path="type">
    <frm:option value="-" label="Please Select..."/>
    <frm:options />
</frm:select><frm:errors path="type" />

Примечания

  1. Я пытался использовать <mvc:annotation-driven validator="userValidator"/> в файле конфигурации Spring, чтобы сделать userValidator глобальным в соответствии с документацией , но по какой-то причине валидатор пользователя не был найден, загружен или использован. Я попытался настроить в [appname]-servlet.xml и в моем main.beandef.xml файле, но без радости. Поэтому я прибег к схеме @InitBinder.
  2. По-видимому, если в вашем сопоставлении запроса нет BindingResult result в качестве аргумента метода, вся процедура проверки прерывается, и вместо возврата к аннотированному методу запроса генерируется исключение, содержащее ошибки проверки, и Spring пытается отправить браузер на страницу 404. То, что вы должны иметь BindingResult (или, возможно, какой-то другой пружинный объект) в качестве аргумента (вообще сейчас!) Не задокументировано.
  3. Перечисления. Казалось бы, если вы используете тег frm:select spring для элемента данных перечисления объекта команды и добавляете дочерний тег <frm:options /> без атрибутов, Spring автоматически заполнит выпадающий список параметрами, для которых их значение и текст установлены на значения enum getName. Я еще не нашел, как привязать к нему пользовательское сообщение пакета ресурсов. В любом случае, эта функциональность полностью не документирована.

1 Ответ

0 голосов
/ 06 декабря 2011
public ModelAndView newUserSave(@ModelAttribute("newUser") @Valid User user, BindingResult result) {
.
.
}

Выше следует выполнить трюк для отображения ошибок валидации.

...