为什么 Notblank 注释显示消息?
Why Notblank annotation displaying message?
我正在开发 spring mvc 网络应用程序。在应用程序中,我在注册表单的 username
字段上放置了 @NotBlank
注释以进行验证。我填写 username
字段并单击 Submit
按钮,此时我收到验证错误消息,但我填写了 username
字段所以为什么 BindingResult
在 username
后面产生错误如果插入少于 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
用户名。
我正在开发 spring mvc 网络应用程序。在应用程序中,我在注册表单的 username
字段上放置了 @NotBlank
注释以进行验证。我填写 username
字段并单击 Submit
按钮,此时我收到验证错误消息,但我填写了 username
字段所以为什么 BindingResult
在 username
后面产生错误如果插入少于 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
用户名。