首页 > 解决方案 > Micronaut 中奇怪的验证错误处理

问题描述

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

  @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{}块永远不会到达,我没有得到任何进一步的日志。

有什么提示吗?

标签: validationgrails-ormmicronaut

解决方案


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

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

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

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

grails.gorm.failOnError: false

对我application.yml来说,现在它就像魅力一样工作。


推荐阅读