gpt4 book ai didi

java - 如何替换异常处理结构

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:15 24 4
gpt4 key购买 nike

我尝试实现 spring security + jwt。我完成了登录和注销方法、jwt 过滤器、提供程序和 Web 配置。所以主要问题是我的 Controller 以及如何向用户返回错误消息,例如,如果用户输入了错误的密码/用户名或用户帐户被禁止等。我得到了一个基于异常处理的结构,看起来很糟糕。

Controller

@PostMapping("/log-in")
public ResponseEntity logIn(@RequestBody UserDto userDto) {
log.info("[LOG-IN] user with username " + userDto.getUsername());
try {
HashMap<String, String> response = userService.logIn(userDto);
return ResponseEntity.ok(response);

} catch (UserStatusException ex) {
return ResponseEntity.badRequest().body("Account is Pending");
} catch (UsernameNotFoundException ex) {
return ResponseEntity.badRequest().body("Could not find account!");
} catch (AuthenticationException ex) {
log.error("Wrong username or password!");
return ResponseEntity.badRequest().body("Wrong username or password!");
}
}

服务

@Override
public HashMap<String, String> logIn(UserDto userDto)throws AuthenticationException, UserStatusException{
User user = findByUsername(userDto.getUsername());

authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(userDto.getUsername(), userDto.getPassword())); //login

checkUserStatus(user); //check if user pending or banned
user.setUserStatus(UserStatus.ACTIVE);

String token = jwtTokenProvider.createToken(user.getUsername(), user.getUserRoles());
HashMap<String, String> response = new HashMap<>();
response.put("token", token);
response.put("username", user.getUsername());
userRepository.save(user);
return response;
}
@Override
public User findByUsername(String username)throws UsernameNotFoundException {
log.info("[UserService, findByUsername]");
User user = userRepository.findByUsername(username);
if(user == null){
log.error("User not found with {} username: ", username);
throw new UsernameNotFoundException("User not found!");
}
log.info("User {} successfully loaded ",username);
return user;
}
@Override
public void checkUserStatus(User user)throws UserStatusException {
if (user.getUserStatus().equals(UserStatus.BANNED)
|| user.getUserStatus().equals(UserStatus.PENDING)) {
throw new UserStatusException("Not confirmed");
}
}

有没有其他方法可以替换这个结构?

最佳答案

您应该使用 ControllerAdvice(参见教程 here)。

这是一个看起来像这样的特殊类

@ControllerAdvice
public class ControllerAdvice {

@ExceptionHandler(PersonNotFoundException.class)
public ResponseEntity <VndErrors > notFoundException(final PersonNotFoundException e) {

return error(e, HttpStatus.NOT_FOUND, e.getId().toString());

}

}

它将允许您将特定的返回码和响应绑定(bind)到您需要处理的每个异常,并且它会自动捕获您的 Controller 返回的所有异常。这也是在同一个地方处理所有异常而不是处理每个异常的好方法...

我不确定,但我认为您甚至可以将它绑定(bind)到 API 的特定映射以获得更多粒度。

希望对您有所帮助!玩得开心!

关于java - 如何替换异常处理结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56718102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com