Spring MVC 3并将验证错误返回到来自@Valid的页面

时间:2011-11-10 03:06:51

标签: validation spring-mvc spring-3 spring-annotations

我累了。过去两周我一直在研究Spring MVC项目,我发现这些文档充其量只是误导,所以我现在正在寻求帮助。 Sooooo .....请帮忙!

问题

我想弄清楚的是,为什么,通过以下设置,验证错误不会被发送回视图,也就是说各种frm:error(s)标记没有显示任何错误。我通过运行时调试检查了POST请求映射的BindingResult参数,并且存在错误。鉴于文档在这方面充其量是模糊的,有人可以指出我错误的分号或启发我的秘密酱是什么,我错过了将验证错误提供给用户,以告知他们他们的个人不足之处?

作为奖励,如果有人知道如何修改自动枚举验证,以便我可以从消息包中添加我自己的验证错误消息,我将非常感激。

请记住,我正在尝试保留这个纯粹的Spring MVC 3.0。我用2.5.6非常好,但我几乎没有使用注释,所以这个项目和其他任何东西一样都是学习练习。我想用纯粹的3.0注释等等,尽管我的大脑正在从我的梦中嘲笑我的文档中反叛,并且让我想抛弃命令对象,将HttpServletRequest设置为我唯一的RequestMapping参数,并且已经完成了用它。

筹码:

春天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. 我尝试在Spring配置文件中使用<mvc:annotation-driven validator="userValidator"/>,使userValidator符合documentation的全局,但由于某种原因,用户验证程序从未被发现,加载或使用过。我已尝试在[appname]-servlet.xml和我的main.beandef.xml文件中进行配置,但没有任何乐趣。所以我采用了@InitBinder方案。
  2. 显然,如果您的请求映射没有BindingResult result作为方法参数,整个验证事件就会爆炸,而不是返回带注释的请求方法,抛出包含验证错误的异常,Spring会尝试将浏览器发送到404页面。您必须将BindingResult(或者可能是其他一些弹簧对象)作为参数(现在一共都是!)没有记录。
  3. 枚举。看起来如果对命令对象的枚举数据成员使用frm:select spring标记并添加无属性<frm:options />子标记,Spring会自动使用具有其值的选项填充下拉选择。文本设置为枚举的getName值。我还没有找到如何将自定义资源包消息绑定到它。无论如何,此功能完全没有记录。

1 个答案:

答案 0 :(得分:0)

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

上面应该有显示验证错误的技巧。