java - 验证时,同一页面上的错误位置显示(类型 = 错误请求,状态 = 400)
问题描述
我想检查注册字段以进行验证。它对我有用,但是如果用户输入错误,那么我会得到一个页面(类型 = 错误请求,状态 = 400),并且应该在表单本身中删除一条带有错误的 SMS。我究竟做错了什么?
@Entity
@Data
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
@Column
@Size(min=2, max=25, message = "от 2 до 25 символов")
@NotNull
private String username;
@Column
@NotNull
private String password;
@Transient
@Column
private String passwordConfirm;
@Column
private String eMail;
public User(){}
public User(String username, String password, String passwordConfirm, String eMail) {
this.username = username;
this.password = password;
this.passwordConfirm = passwordConfirm;
this.eMail = eMail;
}
控制器
@Controller
public class RegistrationController {
@Autowired
private UserService userService;
@GetMapping("/registration")
public String registration(Model model) {
model.addAttribute("userForm", new User());
return "registration";
}
@RequestMapping(value = "/registration", method = RequestMethod.POST) //@ModelAttribute("userForm")
public String addUser(@Valid @ModelAttribute("userForm") User userForm, @RequestParam String username,
@RequestParam String password, @RequestParam String passwordConfirm,
@RequestParam String email, Model model, Errors errors) {
if(errors.hasErrors()){
return "/registration";
} else {
User user = new User(username, password, passwordConfirm, email);
user.setUsername(username);
user.setPassword(password);
user.setPasswordConfirm(passwordConfirm);
user.setEMail(email);
userService.saveUser(user);
return "redirect:/login";
}
}
}
和 html
<div class="row main-form">
<form method="post" th:action="@{/registration}" th:object="${userForm}" modelAttribute="userForm">
<div class="form-group">
<label for="username" class="cols-sm-2 control-label">Ваш Логин</label>
<div class="cols-sm-10">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
<input type="text" class="form-control" th:field="*{username}" name="username" id="username" placeholder="Введите ваш логин"/>
<span class="validationError" th:if="${#fields.hasErrors('username')}" th:errors="*{username}" ></span>
</div>
</div>
</div>
我真的不知道为什么它没有显示相同的注册页面而是出现错误。同时,在idea的日志中,它显示了这个错误和消息错误
解决方案
正如 Spring 文档中在描述Errors
“BindingResult”方法参数时指出的那样(强调我的):
用于访问来自命令对象(即
@ModelAttribute
参数)的验证和数据绑定的错误或来自一个@RequestBody
或多个@RequestPart
参数的验证的错误。您必须在经过验证的方法参数之后立即声明一个Errors
或BindingResult
参数。
请修改您的方法如下(请注意Errors
参数的位置):
@RequestMapping(value = "/registration", method = RequestMethod.POST) //@ModelAttribute("userForm")
public String addUser(
@Valid @ModelAttribute("userForm") User userForm,
Errors errors,
@RequestParam String username,
@RequestParam String password,
@RequestParam String passwordConfirm,
@RequestParam String email,
Model model
) {
if(errors.hasErrors()){
return "/registration";
} else {
User user = new User(username, password, passwordConfirm, email);
user.setUsername(username);
user.setPassword(password);
user.setPasswordConfirm(passwordConfirm);
user.setEMail(email);
userService.saveUser(user);
return "redirect:/login";
}
}
}
推荐阅读
- ns-3 - 如何在 ns3 中的位置上修复节点位置
- elasticsearch - 为什么会抱怨“批量声明模板只能增加存储请求”?
- swiftui - SwiftUI:没有在 DropDelegate 中删除 NSString 值
- smali - 伙计们,当我编辑一个 smali 文件时,我更改了启动应用程序时要在弹出窗口中显示的文本,但文本不显示,但弹出窗口仍然出现
- ssis - 我的ssis包被sql代理运行慢,你有遇到过这个问题吗?
- atom-editor - 显示当前函数原型或其手册页的 Atom 包
- curl - 从groovy运行curl时的输出被发送到错误而不是stdout(进程)?
- python - Python和Matplotlib,如何添加多个窗口?
- reactjs - 侧边栏菜单由它自己呈现
- javascript - 如何解决 Javascript 中的“Uncaught TypeError: Object must be an instance of class”错误?