java - 如何在SpringBoot中验证用户是否存在而没有Optional
问题描述
我有 SpringBoot 应用程序,用户可以使用电子邮件和用户名进行注册。我可以使用可选的 isPresent() 方法验证电子邮件是否已正确存在于数据库中,但我不能对用户名执行相同操作,因为我在我需要的项目中使用了 UserDetailsServiceImpl.java 中的 UserDetailsService。
当我有AppUserRepo.java
AppUser findByUsername(String username);
Optional<AppUser> findByEmail(String email);
代替
Optional<AppUser> findByUsername(String username);
一切正常,但我无法验证用户名是否已经存在。
当我有
Optional<AppUser> findByUsername(String username);
我收到错误,它说我必须更改Optional<AppUser>
To 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();
}
}
它告诉我需要在我的 AppUserRepo.java中更改Optional<AppUser>
为AppUser
用户控制器.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;
}
}
解决方案
利用
AppUser findByUsername(String username);
和
if (myrepo.findByUsername("...") != null)
推荐阅读
- c# - 如何使从模拟摇杆输入转换的旋转不那么“跳跃”
- javascript - ReactJS Ant Design - 单击按钮时打开 DatePicker
- r - R中的summarise_each应用于同一列但不同的分组
- ios - 在 crashlitycs 中更改捆绑包 ID 的问题
- javascript - 如何在使用 jquery ajax 成功后停止递增存储数组?
- dataset - 结果显示在 Google DATASET 搜索中需要多长时间?
- python - 选择性分组,np.where Pandas/Python 查询
- java - 如何在java中为方法添加参数
- python-3.x - 在命令行中执行多个 python 文件
- android - 如何调用选项卡式活动中片段结果的显式意图?