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