【发布时间】:2014-07-17 04:38:06
【问题描述】:
我想在一个使用@Named 注释的类中处理一组异常。
我正在使用 AKKA 演员进行并发。也使用休眠。
在我的 Akka actor 类中,我正在调用 hibernate 方法进行插入操作。
我想知道如何在全球范围内处理所有参与者类中的异常。我可以使用@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一样处理?
【问题讨论】:
-
为什么要将 Spring MVC 注释与 CDI 注释混合使用?你能对你的设计给出一个正确的解释吗?
-
正如我所说,我们正在使用 akka 演员。这些层如下所示:Controllers -> Services(akka actor) -> DAO(Hibernate)。当请求到来时,它会调用关联的 akka actor,然后它会查询数据库并使用 actor 的 tell() 返回结果
-
这并不能解释为什么你使用 CDI 而不是 Spring MVC 注释......
-
它使用 Akka 期货。有时间直到哪个 akka 演员等待响应。如果超过这个值,它会自动发送一个超时错误。所以如果数据库异常(比如唯一键违规),tell()方法不会被调用,响应也不会被发回,导致超时错误
-
再次:为什么你使用 CDI 而不是 Spring MVC
@Controller可以解决这个问题?
标签: java spring hibernate exception-handling akka