Я хочу обработать набор исключений в одном из классов, который аннотируется с помощью @Named
.
Я использую актеров AKKA для параллелизма. Также используйте Hibernate.
В моем классе аккера Akka я вызываю методы спящего режима для операций вставки. Я хочу знать, как обрабатывать исключения во всех классах акторов во всем мире. Я могу сделать это с помощью @ExceptionHandler
и @ControllerAdvice
. Но я считаю, что он работает только на уровне @Controller
.
Пример кода приведен ниже:
@Named("SaveDepartmentService")
public class SaveDepartmentService extends BaseCommonService {
@Autowired
IDepartmentRepository departmentRepository;
@Override
public PartialFunction<Object, BoxedUnit> receive(){
return ReceiveBuilder
.match(Department.class, c->createOrUpdateDepartment(c))
.build()
.orElse(matchAny());
}
private void createOrUpdateDepartment(Department dept){
// try{
departmentRepository.insertOrUpdate(dept);
// }catch (ConstraintViolationException e){
// System.out.println("-------------------------------");
// e.printStackTrace();
// wrap the exception and send as
// sender().tell("Constarint_violation",self());
//}
sender().tell(dept, self());
} }
Я хочу обрабатывать ConstraintViolationException
среди моих участников и отвечать сообщением (eg: sender().tell("CONSTRAINT_VIOLATION", self());
). Я могу сделать то же самое, обработав его в блоке catch, но мне нужно дублировать его во всех классах актеров.
Есть ли способ справиться с этим, как @ControllerAdvice
?
Вы можете использовать обработчик исключений по умолчанию.
Установив обработчик исключаемых исключений по умолчанию, приложение может изменить способ обработки неперехваченных исключений (например, ведение журнала на конкретном устройстве или файле) для тех потоков, которые уже будут принимать любые "по умолчанию" поведение системы.
Но нет никакой разницы между CDI-Beans и Non-CDI-Beans (кстати: я использую его для автоматического увеличения уровня регистрации всех классов в Stacktraces)