Springboot验证异常:org.springframework.validation.BeanPropertyBindingResult异常

时间:2018-11-16 10:50:11

标签: validation spring-mvc spring-boot thymeleaf hibernate-validator

我正在尝试在表单中显示验证错误,但是我无法实现它。 我正在尝试传递空值,我收到了休眠验证消息,但看不到表单验证?

这是我的代码:

@RequestMapping(value = "/register", method = RequestMethod.POST)
    public String saveForm(@Valid Users users,Model model,Errors errors) {
        if(errors.hasErrors()) {
            return "registerPage";
        }
        else {
            model.addAttribute("message","Registered................");
        System.out.println("Save Users TEST------------------------------------>");
        userRepository.save(users);

        return "register-success";
        }


    }

这里是例外:

  

“工资”字段上的对象“用户”中的字段错误:拒绝的值   [空值];码   [NotNull.users.salary,NotNull.salary,NotNull.java.lang.Integer,NotNull];   论点   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[users.salary,salary];参数[];默认消息[薪水]];   默认消息[不得为null]对象'us​​ers'中的字段错误   字段“ dept”:拒绝值[];码   [Size.users.dept,Size.dept,Size.java.lang.String,Size];论点   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[users.dept,dept];参数[];默认消息[dept],10,2];   默认消息[长度应在2到10之间]字段错误   字段“名称”上的对象“用户”:拒绝的值[];码   [Size.users.name,Size.name,Size.java.lang.String,Size];论点   [org.springframework.context.support.DefaultMessageSourceResolvable:   代码[users.name,name];参数[];默认消息[名称],30,2];   默认消息[长度应在2到30之间]]

这是我的用户Pojo:

public class Users implements Serializable{

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private Integer id;
    @Column(name="name")
    @NotNull
    @Size(min=2,max=30,message="Length should be in between 2 to 30")
    private String name;

    @Column(name="salary")
    @NotNull
    private Integer salary;
    @Column(name="dept")
    @NotNull
    @Size(min=2,max=10,message="Length should be in between 2 to 10")
    private String dept;

    ....

    }

这是我的html表单(使用百里香叶):

<h1 th:text="${message}" align="center"></h1>
<div class="container">
    <h2>Registration form</h2>
      <form class="form-horizontal" th:object="${registerCommand}" th:action="@{/rest/users/register}" method="post">
        <div class="form-group">
            <label for="name">Username:</label>
             <input type="text"
                class="form-control" id="name" placeholder="Enter Name"
                name="name" th:field="*{name}"> <br />
            <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}" th:field="*{name}"
                class="alert alert-danger"></p>
        </div>
        <div class="form-group">
            <label for="dept">Department:</label>
             <input type="text"
                class="form-control" id="dept" placeholder="Enter Department"
                name="dept" th:field="*{dept}"> <br />
            <p th:if="${#fields.hasErrors('dept')}" th:errors="*{dept}" th:field="*{dept}"
                class="alert alert-danger"></p>
        </div>
        <div class="form-group">
            <label for="salary">Salary:</label> <input type="text"
                class="form-control" id="salary" placeholder="Enter salary"
                name="salary" th:field="*{salary}"> <br />
            <p th:if="${#fields.hasErrors('salary')}" th:errors="*{salary}" th:field="*{salary}"
                class="alert alert-danger"></p>
        </div>

        <button type="submit" class="btn btn-sucess">Submit</button>
    </form>
</div>

3 个答案:

答案 0 :(得分:1)

发现我的原因,我没有在saveForm控制器中传递正确的参数-

@RequestMapping(value = "/register", method = RequestMethod.POST)
    public String saveForm(@ModelAttribute("registerCommand") @Valid Users users, BindingResult bindingResult, Model model){

        if(bindingResult.hasErrors()) {

            return "registerPage";
        }
        else {
        userRepository.save(users);
        return "register-success";
        }
    }

注意-如果使用的是BindingResult,它应该恰好在Bean之后。

仅顺序有意义的是BindingResult。它必须跟随正在验证的bean,以便Spring知道在哪里放置任何验证错误。

感谢David Lavender的回答 https://stackoverflow.com/a/29075342/6547517

答案 1 :(得分:0)

对象User上的字段'salary'可能为空

答案 2 :(得分:0)

在保存用户对象时检查在用户对象中传递的数据,可能是薪水值将为空。正如您对Users使用@valid一样,输入请求数据中的值不会为null或空值