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

Sha*_*agi 1 validation spring-mvc hibernate-validator thymeleaf spring-boot

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

这是我的代码:

@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";
        }


    }
Run Code Online (Sandbox Code Playgroud)

这是例外:

字段 'salary' 上的对象 'users' 中的字段错误:拒绝值 [null];代码 [NotNull.users.salary,NotNull.salary,NotNull.java.lang.Integer,NotNull]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [users.salary,salary]; 参数 []; 默认消息[薪水]];默认消息 [不得为空] 字段 'dept' 上的对象 'users' 中的字段错误:拒绝值 [];代码 [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, 尺寸]; 参数 [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;

    ....

    }
Run Code Online (Sandbox Code Playgroud)

这是我的 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>
Run Code Online (Sandbox Code Playgroud)

Sha*_*agi 7

找到我的原因,我没有在我的 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";
        }
    }
Run Code Online (Sandbox Code Playgroud)

注意 - 如果您使用 BindingResult,它应该正好在 bean 之后。

只有 BindingResult 的顺序才重要。它必须遵循正在验证的 bean,以便 Spring 知道将任何验证错误放在哪里。

感谢大卫薰衣草的回答 /sf/answers/2035273971/

  • 非常感谢我的朋友,我花了几个小时来处理这个问题!不敢相信! (2认同)