#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" />
Примечания
- Я пытался использовать
<mvc:annotation-driven validator="userValidator"/>
в файле конфигурации Spring, чтобы сделать UserValidator глобальным в соответствии с документацией, но по какой-то причине пользовательский валидатор так и не был найден, загружен или использован. Я пробовал настраивать в[appname]-servlet.xml
и в моемmain.beandef.xml
файле, но безрезультатно. Поэтому я прибегнул к схеме @InitBinder. - По-видимому, если сопоставление вашего запроса не имеет
BindingResult result
в качестве аргумента метода, вся процедура проверки прерывается, и вместо возврата к методу аннотированного запроса выдается исключение, содержащее ошибки проверки, и Spring пытается отправить браузер на страницу 404. То, что у вас должен быть BindingResult (или, возможно, какой-то другой объект spring) в качестве аргумента, (в настоящее время полностью!) не документировано. - Перечисления. Казалось бы, если вы используете
frm:select
тег spring для элемента данных перечисления командного объекта и добавляете<frm:options />
дочерний тег без атрибутов, Spring автоматически заполнит выпадающий список select параметрами, значение и текст которых соответствуютgetName
значениям перечисления. Мне еще предстоит найти, как привязать к ней сообщение пользовательского пакета ресурсов. В любом случае, эта функциональность полностью недокументирована.
Ответ №1:
public ModelAndView newUserSave(@ModelAttribute("newUser") @Valid User user, BindingResult result) {
.
.
}
Выше должно быть показано, как показывать ошибки проверки.