【问题标题】:Global exception handling in @Named class in springSpring @Named 类中的全局异常处理
【发布时间】: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


【解决方案1】:

您可以使用default exception handler

通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件) .

但是在 CDI-Beans 和 Non-CDI-Beans 之间没有区别(顺便说一句:我用它来自动提高 Stacktraces 中所有类的日志记录级别)

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 2016-11-18
    • 2021-08-19
    • 2018-07-19
    • 2016-11-03
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多