401 error вместо 400 (регистрация юзера с неуникальным username)
У меня есть простой rest сервис. При попытке через постман зарегистрировать юзера с существующим юзернэйм, я должен получить 400:BAD_REQUEST, но возвращается 401:ANOUTHORIZED.
FLOW:
@Data
public class AuthenticationRequest {
private String login;
private String password;
}
Endpoint:
@PostMapping("/auth/signup")
public UserDTO signup(@Valid @RequestBody AuthenticationRequest request){
return ObjectMapperUtils.map(userService.saveUser(request), UserDTO.class);
}
Сервис-слой:
public User saveUser(AuthenticationRequest request) {
if (userRepository.findByLoginIgnoreCase(request.getLogin()).isPresent())
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, USER_EXISTS); // Fails here!
User user = new User(request);
user.setPassword(encoder.encode(user.getPassword()));
userRepository.save(user);
return user;
}
securityConfig:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests()
.requestMatchers(HttpMethod.POST, "/restapi/auth/signup").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.httpBasic()
.and()
.csrf().disable();
return http.build();
}
В процессе дебага я падаю в сервисном слое, где бросаю ошибку, но по flow процесс уходит в InvokationTargetException и возвращается 401. Я не понимаю, почему так.
Если изменить конфиг на ".anyRequest().permitAll()" я получаю желаемый результат, но я не хочу открывать все неописанные в конфиге ендпоинты. Есть ли другой способ, не открывая их, не падать с 401?
Источник: Stack Overflow на русском