【问题标题】:Weird validation error handling in MicronautMicronaut 中奇怪的验证错误处理
【发布时间】:2019-08-22 11:58:34
【问题描述】:

我有一个控制器动作来服务我的反应前端。它需要特殊格式的验证消息:

  @Transactional
  @Post( uri = '{/id}', consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON )
  HttpResponse save( @PathVariable @Nullable Long id, @Body Map body ){
    def o = bindFromIdAndBody id, body

    if( o.save( flush:true ) ){
      log.info "version >> $o.version"
      HttpResponse.ok o
    }else{
      log.info '-------------------------'
      List errors = o.errors.fieldErrors.collect{ FieldError fe ->
        fe.codes.findResult{ String c -> 
          messageSource.getMessage c, fe.arguments, null, Locale.default
        } ?: fe.codes.last()
      }
      log.info "save failed for $o: $errors"
      HttpResponse.badRequest( errors:errors )
    }
  }

当我调用操作时,我在客户端中收到 400 Bad Request,但我看到的不是 { errors:[ {..}, {..}, {..} ] 样式的 JSON,而是:

{
  "message":"Validation Error(s) occurred during save() : Field error in object ...  default message [Property [{0}] of class [{1}] cannot be blank]\r\n",
  "path":"fullName",
  "_links":{"self":{"href":"/person/42","templated":false}}
}

另外,else{} 块也永远不会到达,我没有得到任何进一步的日志。

有什么提示吗?

【问题讨论】:

  • 很难确定出了什么问题,因为您没有显示请求的正文是什么样的,不清楚o 是什么,也不清楚您在o 上调用的save(Map) 方法是做什么的。是否在任何类 o 中都有一个受约束的属性,这是一个名为 fullName 的实例,而 fullName 没有在请求的正文中说明?如果是这样,fullName 是从请求中考虑的其他属性派生的属性吗?
  • o 在这种情况下是 GORM Person 域类的一个实例,它有一个非空的 fullName 属性。奇怪的是,几乎相同的代码在 vertx 路由和 ratpack 处理程序中运行良好,而且我很确定在 Grails 中也会以同样的方式运行
  • “也永远不会到达 else{} 块”-这里缺少一些难题,因为从您所展示的内容来看,它几乎需要 JVM 中的错误才能出现这种情况,除非对.save 的调用引发了一个异常,我想你会提到的。如果我能在应用程序中看到它,它可能很容易诊断。
  • @JeffScottBrown 请看我的回答。我认为这应该以某种方式在参考文档中提及。
  • 我没有意识到 ValidationException 被抛出。如果我知道这一点,那将很容易诊断。我很抱歉产生噪音。

标签: validation grails-orm micronaut


【解决方案1】:

看来,在 Micronaut 的 GORM 配置中是通过

  compile 'io.micronaut.configuration:micronaut-hibernate-gorm'

failOnError 默认设置为true。这导致ValidationException 被抛出save() 而不是填充o.errors

为了解决这个问题,我添加了一行

grails.gorm.failOnError: false

到我的application.yml,现在它的工作就像魅力一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多