我累了。在过去的两周里,我一直在做一个 Spring MVC 项目,我发现文档充其量是误导性的,所以我现在求助于求助。太好了……请帮忙!
问题
我想弄清楚的是,为什么在下面的设置中,验证错误没有被发送回视图,也就是说各种frm:error(s)
标签没有显示任何错误。我已经通过运行时调试检查了 POST 请求映射的 BindingResult 参数,并且错误在那里。鉴于文档在这方面充其量是模糊的,任何人都可以指出我放错位置的分号或启发我了解我缺少什么秘诀来向用户提供验证错误以告知他们他们的个人不足之处?
作为奖励,如果有人知道如何修改自动枚举验证,以便我可以从消息包中添加自己的验证错误消息,我将非常感激。
请记住,我试图保留这个纯粹的 Spring MVC 3.0。我在 2.5.6 上做得很好,但我几乎没有使用注释,所以这个项目和其他项目一样是一个学习练习。我想使用纯粹的 3.0 注释等,即使我的大脑正在反抗那些在梦中嘲笑我的文档,让我只想放弃命令对象,将 HttpServletRequest 设置为我唯一的 RequestMapping 参数,并且已经完成用它。
堆栈:
Spring 3.0.6
瓷砖 2.2.2
Glassfish 3.1.1
编码:
春天应用-servlet.xml
<context:component-scan base-package="com.facets.w101.almanac.spring"/>
<mvc:annotation-driven/>
... other stuff
春天 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" />
笔记
- 我尝试在 Spring 配置文件中使用根据文档
<mvc:annotation-driven validator="userValidator"/>
使 userValidator 全局化,但由于某种原因,从未找到、加载或使用用户验证器。我已经尝试在文件中进行配置,但没有任何乐趣。所以我求助于@InitBinder 方案。[appname]-servlet.xml
main.beandef.xml
- 显然,如果您的请求映射没有
BindingResult result
作为方法参数,整个验证事情就会爆炸,而不是返回到带注释的请求方法,而是抛出一个包含验证错误的异常,并且 Spring 尝试将浏览器发送到 404 页面。你必须有 BindingResult (或者可能是其他一些弹簧对象)作为参数(现在总共!)没有记录。 - 枚举。如果您将
frm:select
spring 标记用于命令对象的枚举数据成员并添加无属性<frm:options />
子标记,那么 Spring 将自动使用其值和文本设置为枚举值的选项填充下拉选择getName
。我还没有找到如何将自定义资源包消息绑定到它。无论如何,此功能完全没有记录。