为什么 Spring BindingResult 或验证器不显示任何错误?

Ale*_*lex 1 java spring spring-mvc spring-validator

我正在尝试验证包含电子邮件的 Spring Bean,但是当请求 Bean 中的电子邮件作为空字符串出现时,验证器和 BindingResult 都没有显示任何错误。\n请参阅以下代码:

\n\n

豆角,扁豆:

\n\n
import org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport org.springmodules.validation.bean.conf.loader.annotation.handler.Email;\nimport org.springmodules.validation.bean.conf.loader.annotation.handler.NotEmpty;\n\n@Component("grouponRedemptionFormBean")\n@Scope("prototype")\npublic class GrouponRedemptionBean {\n\n@NotEmpty(message = "Please enter your email addresss.")\n@Email(message = "Please correct your email.")\nprivate String  email;\n   \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制器:

\n\n
import javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport javax.validation.Valid;\n\nimport org.apache.log4j.Logger;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BeanPropertyBindingResult;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.validation.Errors;\nimport org.springframework.validation.Validator;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n\n@Controller\npublic class GrouponVoucherRedemptionController {\n\n@Autowired\n@Qualifier("defaultBeanValidator")\nprivate Validator validator;\n\n@RequestMapping(value="/groupon-redemption.ep", method=RequestMethod.POST)\npublic String PostGrouponRedemption(@Valid @ModelAttribute GrouponRedemptionBean grouponRedemptionBean, BindingResult bindingResult,\nHttpServletRequest request, HttpServletResponse response, Model model){\n\n    Errors errors = new BeanPropertyBindingResult(grouponRedemptionBean, "grouponRedemptionFormBean");\n    validator.validate(grouponRedemptionBean, errors);\n    if(errors.hasErrors()) {\n        bindingResult.addAllErrors(errors);\n    }\n    if (bindingResult.hasErrors()) {\n        return GROUPON_REDEMPTION_VIEW;\n    }    \n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

XML 配置:

\n\n
<mvc:annotation-driven />\n
Run Code Online (Sandbox Code Playgroud)\n

Rom*_*man 7

您的参数顺序错误 -BindingResult必须紧接在模型对象之后(GrouponRedemptionBean在您的情况下)。请参阅文档

或参数必须跟在立即绑定的模型对象后面,因为方法签名可能有多个模型对象,Spring 将为每个模型对象创建一个单独的Errors实例,因此以下示例将不起作用:BindingResultBindingResult

BindingResult 和 @ModelAttribute 的顺序无效。

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, Model model, BindingResult result) { ... }
Run Code Online (Sandbox Code Playgroud)

注意,和Model之间有一个参数。要使其正常工作,您必须按如下方式重新排序参数:PetBindingResult

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, Model model) { ... }
Run Code Online (Sandbox Code Playgroud)