我是Java新手。使用Thymeleaf和Spring-Boot。尝试在输入错误时显示验证消息。 “电话”属性必须介于7到11个字符之间。 如果不遵守规则,将显示验证消息。她是
模型
@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
答案 0 :(得分:0)
如下更改您的span标签。
<span class="bg-danger pull-right" th:if="${invalidPhone}" th:errors="*{phone}">phone Error</span>
答案 1 :(得分:0)
错误消息:
Neither BindingResult nor plain target object for bean name 'phone' available as request attribute.
基本上表明Spring找不到应绑定的bean。您的表单正在专门查找名为phone
的bean名称。实际上,您的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使用user
绑定到th:object
bean。请注意phone
上经过更正的语法:< / strong>
<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文档以获取更多示例。它会给你一个更好的主意。
答案 2 :(得分:0)
@PostMapping( "/signup" )
public String signupPost(@Valid @ModelAttribute("user") User user ,
BindingResult thebindResult, Model model ) {
if(thebindResult.hasErrors()) {
model.addAttribute("invalidPhone" , true);
return "signup";
}
更改BindingResult对象的位置,必须在使用@Valid验证的对象之后立即放置BindingResult。
答案 3 :(得分:0)
从 Controller 中,如下编辑。
@PostMapping( "/signup" )
public String signupPost( @ModelAttribute @Valid User user ,BindingResult thebindResult, Model model) {
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}">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:field="*{phone}" placeholder="xxx-xxx-xxxx" required="required"/>
</div>
</div>
</div
注意 确保您的@GetMapping() 控制器显示注册,您正在将用户传递给模型 即。
@GetMapping 控制器 ........
model.addAttribute("userModel", new User());
........
通知
<form method="post" action="" th:object="${userModel}">
//signup input...
</form>