validation - 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{}
块永远不会到达,我没有得到任何进一步的日志。
有什么提示吗?
解决方案
看来,在 Micronaut 的 GORM 配置中通过
compile 'io.micronaut.configuration:micronaut-hibernate-gorm'
默认情况下failOnError
设置为true
。这导致ValidationException
被抛出save()
而不是填充o.errors
。
为了解决这个问题,我添加了这一行
grails.gorm.failOnError: false
对我application.yml
来说,现在它就像魅力一样工作。
推荐阅读
- python - 尝试划分两个屏蔽数组时出现类型错误
- html - knitr:编织到 HTML - 为图形和表格编号添加前缀
- java - Docker 找不到用户:OpenJdk11 的 passwd 文件中没有匹配的条目
- angular - 错误参考错误:在 Angular 项目中未定义科尔多瓦
- python-3.x - Python 变量范围捕获规则
- jquery - jQuery 命令在浏览器的控制台中有效,但在代码中无效
- java - 使用 Gradle 下载多个文件
- javascript - 忽略本地计算机时间并使用 momentjs 从时区获取日期和时间
- javascript - 图像和纹理未在三个 js 中加载
- mysql - 将表导入服务器时Mysql TIMEANDDATE发生变化