Spring MVC 3 и возврат ошибок проверки на страницу из @Valid

#validation #spring-mvc #spring-3 #spring-annotations

#проверка #spring-mvc #spring-3 #spring-аннотации

Вопрос:

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

Вопрос

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

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

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

Стек:

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 (или, возможно, какой-то другой объект spring) в качестве аргумента, (в настоящее время полностью!) не документировано.
  3. Перечисления. Казалось бы, если вы используете frm:select тег spring для элемента данных перечисления командного объекта и добавляете <frm:options /> дочерний тег без атрибутов, Spring автоматически заполнит выпадающий список select параметрами, значение и текст которых соответствуют getName значениям перечисления. Мне еще предстоит найти, как привязать к ней сообщение пользовательского пакета ресурсов. В любом случае, эта функциональность полностью недокументирована.

Ответ №1:

 public ModelAndView newUserSave(@ModelAttribute("newUser") @Valid User user, BindingResult result) {
.
.
}
  

Выше должно быть показано, как показывать ошибки проверки.