Здесь довольно похожий вопрос , но ответа на мой вопрос недостаточно.
У меня есть этот метод в @Service
классе:
@Async
public void activateUser(...){
if(someCondition){
throw new GeneralSecurityException();
}
}
Контроллер:
@GetMapping( "/activate")
public ResponseEntity<Void> activate(...){
myService.activateUser(...);
}
И совет контроллера:
@RestControllerAdvice( basePackages = "com.app.security" )
public class SecurityAdviceController extends ResponseEntityExceptionHandler {
@ExceptionHandler( GeneralSecurityException.class )
public ResponseEntity<GeneralSecurityExceptionBody> handleGeneralSecurityException( GeneralSecurityException ex ) {
return ResponseEntity
.status( HttpStatus.MOVED_PERMANENTLY )
.header( HttpHeaders.LOCATION, ex.getUrl() )
.body( null );
}
Вот и мы.Поскольку исключение будет брошено в другой поток, как я могу сделать его доступным для @RestControllerAdvice
?
Многие предлагают реализовать AsyncUncaughtExceptionHandler , и я согласен, но это не отвечаетвопрос.
Когда я удаляю @Async
, все в порядке, и я вижу, что один и тот же поток выполняет все задачи, но с @Async
у меня задействовано 2 потока.
Одним из решений было бы получение исключения, генерируемого родительским потоком (но это слишком громоздко, и я не вижу, как это реализовать).
Спасибо за вашу помощь.