【问题标题】:Hibernate @Validator with Spring Boot使用 Spring Boot 休眠 @Validator
【发布时间】:2017-03-14 10:03:56
【问题描述】:

我有一个控制器方法来处理重置密码表单的 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 
}

【问题讨论】:

  • 您希望验证什么? token & password 来自请求?
  • @bureaquete 是的
  • 为什么不在你的控制器方法中使用@RequestBody而直接使用User类呢?然后你可以给它添加@Valid注解,因为表单本质上是User类,对吧?虽然 tokenreset_token 字段名称不同。
  • 尽管某些字段会失败,因为您只需要密码,而不需要其他非可选字段,但您应该创建一个单独的 NewPasswordRQ 类,并为密码和令牌字段提供适当的注释,并像我一样使用它上面已经解释过了~

标签: java spring hibernate spring-boot


【解决方案1】:

您应该创建一个单独的类,最好直接使用该类作为您的请求主体,以便能够在其上应用@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;
}

新建请求 Bean

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在控制器层中特定于端点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2020-12-16
    • 2020-11-07
    相关资源
    最近更新 更多