我有一个包含用户信息一个实体类:更新用户信息(春季启动)
@Entity
@Table(name = "user")
@PasswordMatch(message="{register.repeatPassword.mismatch}")
@DynamicUpdate
public class SiteUser {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "email", unique=true)
@Email(message="{register.email.invalid}")
@NotBlank(message="{register.email.invalid}")
private String email;
@Transient
@Size(min=5, max=15, message="{register.password.size}")
private String plainPassword;
@Transient
private String repeatPassword;
@Column(name = "password", length=60)
private String password;
@Column(name="enabled")
private boolean enabled = false;
@Column(name="role", length=20)
private String role;
@NotNull
@Column(name="firstname", length=20)
@Size(min=2, max=20, message="{register.firstname.size}")
private String firstname;
@NotNull
@Column(name="surname", length=25)
@Size(min=2, max=25, message="{register.surname.size}")
private String surname;
public SiteUser() {
}
public SiteUser(String email, String password, String firstname, String surname) {
this.email = email;
this.setPlainPassword(password);
this.repeatPassword = password;
this.enabled= true;
this.firstname= firstname;
this.surname= surname;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getPlainPassword() {
return plainPassword;
}
public void setPlainPassword(String plainPassword) {
this.password = new BCryptPasswordEncoder().encode(plainPassword);
this.plainPassword = plainPassword;
}
public String getRepeatPassword() {
return repeatPassword;
}
public void setRepeatPassword(String repeatPassword) {
this.repeatPassword = repeatPassword;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
我的问题是,注册用户我加的独特和@NotBlank注解给我的电子邮件和名字/姓氏列所以现在我想只更新我的密码我有2个问题
1 - 我必须添加其他字段隐藏在更新形式,因为当我尝试更新我的数据,他们不能为空
2-使用道的save()方法我得到一个错误,说明有相同的电子邮件数据库。
这个问题有什么样的逻辑解决方案吗?
====================更新=========================
控制器:
@RequestMapping(value ="/resetPassword", method = RequestMethod.GET)
ModelAndView resetPasswordMailRecieved(ModelAndView modelAndView, @RequestParam("t") String tokenString) {
VerificationToken token = userService.getVerificationToken(tokenString);
SiteUser user = token.getUser();
if(token == null)
{
modelAndView.setViewName("redirect:/invalidUser");
return modelAndView;
}
Date expirydate = token.getExpiry();
if(expirydate.before(new Date()))
{
modelAndView.setViewName("redirect:/expiredToken");
userService.deleteToken(token);
return modelAndView;
}
userService.deleteToken(token);
modelAndView.getModel().put("user", user);
modelAndView.setViewName("app.resetPass");
return modelAndView;
}
JSP文件:
<form:form method="post" modelAttribute="user" class="login-form">
<form:input type="hidden" path="firstname" />
<form:input type="hidden" path="surname" />
<form:input type="hidden" path="email" />
<div class="input-group">
<form:input type="password" path="plainPassword"
placeholder="Password" class="form-control" />
</div>
<div class="input-group">
<form:input path="repeatPassword" type="password"
placeholder="Repeat password" class="form-control" />
</div>
<div class="input-group">
<button type="submit" class="btn-primary pull-right">Change
Password</button>
</div>
</form:form>
userDAO的:
@Repository
public interface UserDao extends CrudRepository<SiteUser, Long> {
SiteUser findByEmail(String email);
}
UserService:
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserDao userDao;
@Autowired
PasswordEncoder encoder;
@Autowired
private VerificationDao verificationDao;
public void register(SiteUser user) {
user.setRole("ROLE_USER");
userDao.save(user);
}
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
SiteUser user = userDao.findByEmail(email);
if (user == null) {
return null;
}
List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList(user.getRole());
String password = user.getPassword();
boolean enabled = user.isEnabled();
return new User(email, password, enabled, true, true, true, auth);
}
public void save(SiteUser user)
{
userDao.save(user);
}
public void updatePass(SiteUser user,String pass){
user.setPlainPassword(pass);
}
public String createEmailVerificationToken(SiteUser user)
{
VerificationToken token = new VerificationToken(UUID.randomUUID().toString(), user, TokenType.REGISTRATION);
verificationDao.save(token);
return token.getToken();
}
public String createPasswordResetVerificationToken(SiteUser user)
{
VerificationToken token = new VerificationToken(UUID.randomUUID().toString(), user, TokenType.PASSWORD_RESET);
verificationDao.save(token);
return token.getToken();
}
public VerificationToken getVerificationToken(String token)
{
return verificationDao.findByToken(token);
}
public void deleteToken(VerificationToken token) {
verificationDao.delete(token);
}
public SiteUser get(String email) {
return userDao.findByEmail(email);
}
public SiteUser get(Long id) {
return userDao.findOne(id);
}
}
确实张贴了DAO和服务代码以及 –
@邦德JavaBond嘿老兄,我也加了服务和道码。 –