hibernate - 我的验证消息在 Thymeleaf 中不起作用
问题描述
我是 Java 新手。使用 Thymeleaf 和 Spring-Boot。尝试在错误输入时显示验证消息。“电话”属性必须介于 7 到 11 个字符 int 之间。如果不遵守规则,将显示验证消息。她是
该模型
@Entity
@Table(name="users")
public class User {
@Column(name="phone")
@Size(min=7 , max=11 , message="Invalid Number")
private int phone;
}
我的控制器
@PostMapping( "/signup" )
public String signupPost(@Valid @ModelAttribute("user") User user ,
Model model , BindingResult thebindResult ) {
if(thebindResult.hasErrors()) {
model.addAttribute("invalidPhone" , true);
return "signup";
}
我的观点
<div class="form-group">
<label for="phone" class="cols-sm-2 control-
label">Phone</label><span class="bg-danger pull-right"
th:if="${invalidPhone}" th:errors="{*'phone'}" >phone
Error</span>
<div class="cols-sm-10">
<div class="input-group" >
<span class="input-group-addon" ><i class="fa
fa-phone fa" aria-hidden="false" ></i> </span>
<input type="text" class="form-control"
th:value="${user.phone}" id="phone" name="phone"
roleId="phone"
th:field="*{phone}" placeholder="xxx-xxx-xxxx"
required="required"/>
</div>
</div>
</div
错误
Neither BindingResult nor plain target object for bean name 'phone'
available as request attribute
解决方案
的错误信息:
Neither BindingResult nor plain target object for bean name 'phone' available as request attribute.
基本上表明Spring找不到它应该绑定的bean。您的表单正在专门寻找一个名为phone
. 实际上,您的 bean 被称为user
.
您还可以添加一个验证器来分离关注点。您可能会进行大量验证:
@Autowired
public UserController(UserFormValidator userFormValidator) {
this.userFormValidator = userFormValidator;
}
@GetMapping("/signup")
public String signup(Model model) {
model.addAttribute("user" , new User()); //it is expecting a user bean
return "signup";
}
@PostMapping("/signup")
public String signupPost(@ModelAttribute("user") User user, Errors result) {
userFormValidator.validate(bean, result);
if(result.hasErrors()) {
//maybe log it here
return "signup";
}
//some other logic
}
private final UserFormValidator userFormValidator;
然后你会想告诉 Spring 使用 .bin 绑定到user
bean th:object
。 请注意以下更正的语法phone
:
<form class="form-horizontal" th:object="${user}" method="post" th:action="@{/signup}">
<div class="form-group">
<label for="phone" class="cols-sm-2 control-label">Phone</label>
<span th:errorclass="someErrorClass" th:if="${#fields.hasErrors('phone')}" th:errors="*{phone}">* Please check the Phone field.</span>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-phone" aria-hidden="false" ></i> </span>
<input type="tel" <!-- helpful for mobile -->
class="form-control"
id="phone"
name="phone"
th:field="*{phone}"
maxlength="255" <!--or whatever, prevents overflowing your DB column-->
required="required"/>
</div>
</div>
</div>
</form>
然后你可以创建一个验证器来支持表单验证:
@Component
@Slf4j
public class UserFormValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return User.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object model, Errors errors) {
if (!SomeUtil.isFormValidationEnabled()) {
log.debug("Validation disabled. Returning.");
return;
}
User user = (user) model;
if (SomeUtil.isMissing(user.getPhone())) {
errors.rejectValue("phone",
"phone.isMissing",
"Please enter a valid phone number.");
}
}
}
您可以阅读 Thymeleaf 文档以获取更多示例。它会给你一个更好的主意。
推荐阅读
- windows - 有没有办法缩短网络驱动器文件路径?
- python - 无法使用 python 显示 yfinance 的股息历史记录
- c# - 天蓝色管道没有找到测试结果文件
- python - 无法激活 python 虚拟环境 vscode
- python - 使用python的分配优化问题
- c# - 我想使用 WinForms C# 修改由 Windows 服务执行的对象
- android - 为什么 File(uri.path) 有效但 uri.toFile() 无效(错误:Uri 缺少“文件”方案)
- spack - 为什么 spack 不向环境文件系统视图添加外部包?
- python - .corr() - Correlation ignores columns with numeric data
- python - 如何可视化加密货币的实时数据烛台图?