【发布时间】: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在这种情况下是 GORMPerson域类的一个实例,它有一个非空的fullName属性。奇怪的是,几乎相同的代码在 vertx 路由和 ratpack 处理程序中运行良好,而且我很确定在 Grails 中也会以同样的方式运行 -
“也永远不会到达 else{} 块”-这里缺少一些难题,因为从您所展示的内容来看,它几乎需要 JVM 中的错误才能出现这种情况,除非对
.save的调用引发了一个异常,我想你会提到的。如果我能在应用程序中看到它,它可能很容易诊断。 -
@JeffScottBrown 请看我的回答。我认为这应该以某种方式在参考文档中提及。
-
我没有意识到
ValidationException被抛出。如果我知道这一点,那将很容易诊断。我很抱歉产生噪音。
标签: validation grails-orm micronaut