首页 > 解决方案 > 验证时,同一页面上的错误位置显示(类型 = 错误请求,状态 = 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的日志中,它显示了这个错误和消息错误

标签: javaspringspring-boothibernatevalidation

解决方案


正如 Spring 文档中在描述Errors“BindingResult”方法参数时指出的那样(强调我的):

用于访问来自命令对象(即@ModelAttribute参数)的验证和数据绑定的错误或来自一个@RequestBody或多个@RequestPart参数的验证的错误。您必须在经过验证的方法参数之后立即声明一个ErrorsBindingResult参数。

请修改您的方法如下(请注意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";
    }
  }

}

推荐阅读