为什么 Notblank 注释显示消息?

Why Notblank annotation displaying message?

我正在开发 spring mvc 网络应用程序。在应用程序中,我在注册表单的 username 字段上放置了 @NotBlank 注释以进行验证。我填写 username 字段并单击 Submit 按钮,此时我收到验证错误消息,但我填写了 username 字段所以为什么 BindingResultusername 后面产生错误如果插入少于 3 个或多于 12 个字符,字段和我的 @Size 注释将不起作用。

下面是代码:

实体:

public class Registration {
    
    @NotBlank(message = "Username can not be empty !")
    @Size(min = 3, max = 12, message = "Username must be in 3 to 12 character") // Not working
    private String username;
    
    private String email;
    private Boolean agree;

    // constructor, getter, setter and toString()
}

控制器:

@GetMapping("/form")
public String formPage(Model mdl)
{
    mdl.addAttribute("registration", new Registration());
    return "form";
}
    
@PostMapping("/register")
public String registerUser(@Valid @ModelAttribute("registration") Registration registration, 
            BindingResult result)
{
    if(result.hasErrors())
    {
        System.out.println(result);
        return "form";
    }
        
    return "success";
}

form.html:

<form class="bg-white p-5" th:action="@{/register}" method="post" th:object="${registration}">
    <h1 class="text-center pt-2 pb-2">Signup Form</h1>
    <div class="mb-3">
        <label for="username" class="form-label">Username</label>
        <input type="text" 
            class="form-control"
            th:value="${registration.username}"
            id="username" />
        <p th:each="error : ${#fields.errors('username')}" th:text="${error}">
                        
        </p>
    </div>
    <div class="mb-3">
        <label for="email" class="form-label">Email address</label>
        <input type="text" 
            class="form-control"
            id="email"
            th:value="${registration.email}"
            aria-describedby="emailHelp" />
    </div>
    <div class="mb-3 form-check">
        <input type="checkbox" 
            class="form-check-input" 
            id="exampleCheck1">
        <label class="form-check-label" for="exampleCheck1">Check me out</label>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

Xml 验证:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

问题快照:

您的输入需要使用绑定语法 *{..}。替换:

<input type="text" 
            class="form-control"
            th:value="${registration.username}"
            id="username" />

与:

<input type="text" 
            class="form-control"
            th:value="*{username}"
            id="username" />

问题就在这里

<input type="text" 
       class="form-control" 
       th:value="${registration.username}" 
       id="username"/>

您缺少 name 属性。

<input type="text" 
       class="form-control" 
       th:value="${registration.username}" 
       id="username" 
       name="username"/>

这将解决它。

表单通常绑定到一个对象 - Registration 在您的情况下,使用 input 标签的 name 属性。注释有效,问题是由于缺少属性,您在 Registration 中收到 null 用户名。