我有一个控制器方法来处理POST请求,以获取重置密码表单。该表单具有用于重置令牌的隐藏输入字段,并提示用户输入新密码。

我想在下面的代码中使用@Valid批注,但不确定是否可以使用现有的User类。

Hibernate Validator是否需要我专门为表单创建其他类?

控制器方式

@RequestMapping(value = "/resetPassword", method = RequestMethod.POST)
public ModelAndView setNewPassword(@RequestParam Map<String,String> requestParams) {
  User user = userService.findUserByResetToken(requestParams.get("token"));

  ModelAndView modelAndView = new ModelAndView();
  modelAndView.addObject("message", "Form data is " + requestParams.get("token") + requestParams.get("password") + user.getEmail());
  modelAndView.setViewName("resetPassword");

  return modelAndView;
}


用户类别

@Entity
@Table(name = "user")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private int id;

  @Column(name = "email")
  @Email(message = "Please provide a valid e-mail")
  @NotEmpty(message = "Please provide an e-mail")
  private String email;

  @Column(name = "password")
  @Size(min = 8, max = 72, message = "Your password must be between 8 and 72 characters long")
  @NotEmpty(message = "Please provide a password")
  @Transient
  private String password;

  @Column(name = "first_name")
  @NotEmpty(message = "Please provide your first name")
  private String firstName;

  @Column(name = "last_name")
  @NotEmpty(message = "Please provide your last name")
  private String lastName;

  @Column(name = "enabled")
  private boolean enabled;

  @Column(name = "confirmation_token")
  private String confirmationToken;

  @Column(name = "created_on")
  private Date createdOn;

  @Column(name = "last_login")
  private Date lastLogin;

  @Column(name = "reset_token")
  private String resetToken;

  // Getters and setters omitted
}

最佳答案

您应该创建一个单独的类,也最好直接使用该类作为您的请求主体,以便能够在其上应用@Valid

控制器方式

@RequestMapping(value = "/resetPassword", method = RequestMethod.POST)
public ModelAndView setNewPassword(@RequestBody @Valid PasswordUpdateRq passwordUpdateRq) {
  User user = userService.findUserByResetToken(passwordUpdateRq.getToken());

  ModelAndView modelAndView = new ModelAndView();
  modelAndView.addObject("message", "Form data is " + passwordUpdateRq.getToken() + passwordUpdateRq.getPassword() + user.getEmail());
  modelAndView.setViewName("resetPassword");

  return modelAndView;
}


新请求豆

public class PasswordUpdateRq {
  @Size(min = 8, max = 72, message = "Your password must be between 8 and 72 characters long")
  @NotEmpty(message = "Please provide a password")
  private String password;
  private String token;

  // Getters and setters omitted
}


这将使验证自动按照您的要求进行。 User类在此处不可用的原因是,存在其他具有@NotEmpty等限制的字段,这些字段在您当前的表单中不存在,并且这些字段始终会导致验证失败。

额外的注释:我认为将同一对象用于数据库的控制器层验证和操作会在两者之间建立高度的耦合,我建议将表相关的类保留在逻辑类下,并使用在控制器层中特定于端点的接口Bean。

关于java - 使用Spring Boot hibernate @Validator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42776307/

10-12 00:39
查看更多