我有一个springboot应用程序,用户可以注册使用电子邮件和用户名。我可以用可选的ispresent()方法验证数据库中是否已经存在电子邮件,但是我不能用username做同样的事情,因为userdetailsserviceimpl.java中的userdetailsservice正在我需要的项目中使用。
当我进来的时候 AppUserRepo.java
```
AppUser findByUsername(String username);
Optional findByEmail(String email);
而不是
Optional findByUsername(String username);
一切正常,但我无法验证用户名是否已经存在。
当我有
Optional findByUsername(String username);
我犯了错误,它说我必须改变 `Optional<AppUser>` 至 `AppUser` .
我怎样才能解决这个问题?
我的appuser存储库-appuserrepo.java
import java.util.Optional;
@Repository
public interface AppUserRepo extends JpaRepository<AppUser, Long> {
AppUser findByUsername(String username);
Optional<AppUser> findByEmail(String email);
}
当我想使用 `Optional<AppUser> findByUsername(String username);` 我在userservice.java中出错
用户服务.java
@Service
public class UserService {
private TokenRepo tokenRepo;
private MailService mailService;
private AppUserRepo appUserRepo;
private PasswordEncoder passwordEncoder;
@Autowired
public UserService(AppUserRepo appUserRepo, PasswordEncoder passwordEncoder, TokenRepo tokenRepo, MailService mailService) {
this.appUserRepo = appUserRepo;
this.passwordEncoder = passwordEncoder;
this.tokenRepo = tokenRepo;
this.mailService = mailService;
}
public void addUser(AppUser appUser) {
appUser.setPassword(passwordEncoder.encode(appUser.getPassword()));
appUser.setRole("ROLE_USER");
appUserRepo.save(appUser);
sendToken(appUser);
}
private void sendToken(AppUser appUser) {
String tokenValue = UUID.randomUUID().toString();
Token token = new Token();
token.setValue(tokenValue);
token.setAppUser(appUser);
tokenRepo.save(token);
String url = "http://localhost:8080/token?value=" + tokenValue;
try {
mailService.sendMail(appUser.getEmail(), "Register", url, false);
} catch (MessagingException e) {
e.printStackTrace();
}
}
@Transactional
public Optional <AppUser> findByEmail(String email) {
return appUserRepo.findByEmail(email);
}
@Transactional
public Optional <AppUser> findByUsername(String username) {
return appUserRepo.findByEmail(username);
}
public boolean appUserEmailExists(String email){
return findByEmail(email).isPresent();
}
public boolean appUserUsernameExists(String username){
return findByUsername(username).isPresent();
}
}
它告诉我需要从 `Optional<AppUser>` 至 `AppUser` 在我的appuserrepo.java中
用户控制器.java
@Controller
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/register")
public String register(@ModelAttribute AppUser appUser, Model model) {
model.addAttribute("appUser", new AppUser());
return "register";
}
@PostMapping("/register")
public String registerOk(@Valid @ModelAttribute("appUser") AppUser appUser, BindingResult bindingResult, Model model) {
// if (userService.appUserUsernameExists(appUser.getUsername())) {
// bindingResult.addError(new FieldError
// ("appUser", "username", "Login already exists"));
// }
if (userService.appUserEmailExists(appUser.getEmail())) {
bindingResult.addError(new FieldError
("appUser", "email", "Email already exists"));
}
if (bindingResult.hasErrors()) {
return "register";
} else {
userService.addUser(appUser);
return "redirect:register?success";
}
}
}
下面的类实现了我遇到问题的userdetailsservice。userdetailsserviceimpl.java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private AppUserRepo appUserRepo;
@Autowired
public UserDetailsServiceImpl(AppUserRepo appUserRepo) {
this.appUserRepo = appUserRepo;
}
@Override
public UserDetails loadUserByUsername(String user) throws UsernameNotFoundException {
return appUserRepo.findByUsername(user);
}
}
应用程序用户.java
@Data
@Entity
public class AppUser implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Size(min = 4, message = "Atleast 4 characters")
private String username;
@Size(min = 6, message = "Atleast 6 characters")
private String password;
private String role;
@Column(name = "Email")
@NotBlank
@Email(message = "real e-mail adress required")
private String email;
@Pattern(regexp = "\\d{9}")
private String phone;
@NotBlank
private String name;
@NotBlank
private String surname;
private boolean isEnabled;
public AppUser() {
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.singleton(new SimpleGrantedAuthority(role));
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return isEnabled;
}
}
1条答案
按热度按时间s5a0g9ez1#
使用
和