在Springboot应用程序中使用monads来捕获异常

时间:2017-02-18 10:17:31

标签: java spring spring-mvc spring-boot monads

所以我们的项目后端是一个Java 8 Springboot应用程序,springboot允许你很容易地做一些事情。例如,请求验证:

class ProjectRequestDto {
    @NotNull(message = "{NotNull.DotProjectRequest.id}")
    @NotEmpty(message = "{NotEmpty.DotProjectRequest.id}")
    private String id;
}

当不满足此约束时,spring(springboot?)实际上会抛出一个验证异常,因此,我们在应用程序中的某处捕获它并为我们的应用程序构造一个404(错误请求)响应。

现在,鉴于这一事实,我们在整个应用程序中遵循相同的理念,即在应用程序的更深层次上,我们可能会有类似的东西:

class ProjectService throws NotFoundException {
  DbProject getProject(String id) {
      DbProject p = ... // some hibernate code
      if(p == null) {
          Throw new NotFoundException();
      }

      return p;
  }
}

我们再次在更高级别捕获此异常,并为客户端构建另一个404。

现在,这引起了一些问题:

  1. 最重要的一点:我们的错误跟踪停止有用,我们无法区分(轻松)异常很重要,因为它们一直发生,所以如果服务突然开始抛出错误,我们就不会注意到为时已晚。

  2. 大量无用的日志记录,例如登录请求,用户可能会错误输入他的密码,我们记录这个并作为一个小问题:我们的分析无法帮助我们确定我们实际上做错了什么,我们看到了很多4xx,但这是我们所期望的。

  3. 例外情况成本很高,收集堆栈跟踪是一项资源密集型任务,此时的一个小问题,因为服务扩展会变得更加困难。

  4. 我认为解决方案非常明确,我们需要进行体系结构更改,不要将异常作为我们正常数据流的一部分,但这是一个很大的变化而且我们的时间很短,所以我们计划随着时间的推移迁移,但问题仍然存在于短期内。

    现在,根据我的实际问题:当我问我们的一位建筑师时,他建议使用monads(作为c的时间解决方案),因此我们不会修改我们的架构,而是应对最污染的端点(例如,错误的登录)在短期内,但是我在整体上对monad范式挣扎,甚至更多在java中,我真的不知道如何将它应用到我们的项目中,你能帮我解决这个问题吗?一些代码片段真的很棒。

    TL:DR:如果您采用一般的Spring启动应用程序将错误作为其数据流的一部分,那么如何应用monad模式以避免登录不必要的数据量并暂时将此错误修复为数据流的一部分架构。

0 个答案:

没有答案