【问题标题】:BindingResult isn't detecting JSR:303 annotation based errorsBindingResult 未检测到基于 JSR:303 注释的错误
【发布时间】:2014-08-25 19:57:28
【问题描述】:

我是 Spring MVC 的新手。我正在尝试一个简单的应用程序来验证表单值。我使用 Spring BindingResult 和 JSR303 进行字段验证。但由于某种原因,验证错误不会出现在错误标签中。事实上,绑定结果并没有返回任何错误。

我的豆子如下:

package com.app.ebl.bean.login;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


public class LoginBean {

  @NotNull(message = "User Name field can not be blank")
  @Size(max = 10, message = "User Name should not be more than 10 characters")
  private String userName;

  private String password;

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }



}

我的控制器类如下所示,

package com.app.ebl.controller.login;

import javax.validation.Valid;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.app.ebl.bean.login.LoginBean;


@Controller
public class LoginController {
  private static final Log log = LogFactory.getLog(LoginController.class);

  @RequestMapping(value="/login", method=RequestMethod.GET)
  public String toLogin(Model model)
  {
    model.addAttribute("login",new LoginBean());
    return "login";
  }

  @RequestMapping(value="/authenticate", method=RequestMethod.POST)
  public String authenticate(@ModelAttribute(value = "login") @Valid LoginBean login,
      BindingResult bindingResult, Model model)
  {

    if(bindingResult.hasErrors()) {
      return "login";
    }

    model.addAttribute("userName",login.getUserName());
    return "home";
  }

}

现在如果我在用户名字段中没有提供任何值,系统不会验证相同的值,并允许我进入下一个视图。

谁能帮帮我。 提前致谢,

【问题讨论】:

  • 您的代码看起来不错。您是否在项目中添加了hibernate-validation.jar(不仅仅是validation-api.jar)?
  • 如果将@Size 替换为@Length(或@NotEmpty/@NotBlank)会起作用吗?
  • 我已经添加了validation-api的依赖。但是每当我尝试添加以下内容时, org.hibernatehibernate-validator5.1.1.Final Eclipse 是向我显示错误“缺少工件 org.hibernate:hibernate-validator:jar:5.1.1.Final”

标签: java spring validation spring-mvc


【解决方案1】:

我花了一段时间才弄清楚这一点,我希望这对某人有所帮助。

我遇到了同样的问题。 bean 只是没有得到验证。

我所做的是通过“buildpath”菜单创建了一个库,并将 hibernate-validator.jar 添加到我的库中。我可以使用休眠注释并且我没有收到任何编译错误,但是当我运行它时,bean 从未得到验证。

原因是应用程序需要 WEB-INF/lib 文件夹中的 hibernate-validator.jar,以便它可以使用它进行验证。

【讨论】:

  • 我的意思是,5 年后这对我有很大帮助:):):)
【解决方案2】:

@Size 注释接受 min 和 max 参数。当min 没有提供时,它使用默认值:

/**
 * @return size the element must be higher or equal to
 */
int min() default 0;

您没有提供任何内容,我猜您的控制器不会将空字符串转换为 null。首先,我会从org.hibernate.validator 切换到@NotBlank 注释。除了@NotNull,它还删除了尾随空格:

public class LoginBean {

  @NotBlank(message = "User Name field can not be blank")
  @Size(max = 10, message = "User Name should not be more than 10 characters")
  private String userName;
....

另外,在你的控制器中定义初始化绑定器,它会在 StringTrimmerEditor 的帮助下将空字符串从 org.springframework.beans.propertyeditors.StringTrimmerEditor 更改为 null

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

【讨论】:

  • 非常感谢。现在问题已经解决了。确实,我变得空白而不是空。还需要休眠验证器 jar。感谢这段代码现在也在修剪空格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多