错误中的ValidationException错误

时间:2016-01-30 04:51:46

标签: json grails validationexception

在grails 2.3中,我想通过JSON发送自定义错误消息。但是当我使用

class ApiError {
    String message
    String status
    Exception error
}

并尝试解析它as JSON我得到:(我省略了无关紧要的消息和状态)

"error": {
    "cause": null
    "class": "grails.validation.ValidationException"
    "errors": {
        "errors": [1]
        0:  {
            "object": "com.example.Firm"
            "field": "context"
            "rejected-value": null
            "message": "Property [context] of class [class com.example.Firm] cannot be null"
        }
    }
    "localizedMessage": "Firm is not valid: - Field error in object 'com.example.Firm' on field 'context': rejected value [null]; codes [com.example.Firm.context.nullable.error.com.example.Firm.context,com.example.Firm.context.nullable.error.context,com.example.Firm.context.nullable.error.java.lang.String,com.example.Firm.context.nullable.error,firm.context.nullable.error.com.example.Firm.context,firm.context.nullable.error.context,firm.context.nullable.error.java.lang.String,firm.context.nullable.error,com.example.Firm.context.nullable.com.example.Firm.context,com.example.Firm.context.nullable.context,com.example.Firm.context.nullable.java.lang.String,com.example.Firm.context.nullable,firm.context.nullable.com.example.Firm.context,firm.context.nullable.context,firm.context.nullable.java.lang.String,firm.context.nullable,nullable.com.example.Firm.context,nullable.context,nullable.java.lang.String,nullable]; arguments [context,class com.example.Firm]; default message [Property [{0}] of class [{1}] cannot be null] "
    "message": "firm is not valid: - Field error in object 'com.example.Firm' on field 'context': rejected value [null]; codes [com.example.Firm.context.nullable.error.com.example.Firm.context,com.example.Firm.context.nullable.error.context,com.example.Firm.context.nullable.error.java.lang.String,com.example.Firm.context.nullable.error,firm.context.nullable.error.com.example.Firm.context,firm.context.nullable.error.context,firm.context.nullable.error.java.lang.String,firm.context.nullable.error,com.example.Firm.context.nullable.com.example.Firm.context,com.example.Firm.context.nullable.context,com.example.Firm.context.nullable.java.lang.String,com.example.Firm.context.nullable,firm.context.nullable.com.example.Firm.context,firm.context.nullable.context,firm.context.nullable.java.lang.String,firm.context.nullable,nullable.com.example.Firm.context,nullable.context,nullable.java.lang.String,nullable]; arguments [context,class com.example.Firm]; default message [Property [{0}] of class [{1}] cannot be null] "
    "stackTrace": [...143]
    "suppressed": [0]
}

我不明白;在错误中使用错误数组的意义何在?以及如何只获得一个错误数组? Here是此类的源代码。

1 个答案:

答案 0 :(得分:1)

Grails验证错误包含全局错误和字段错误。每当grails中发生验证异常时,它不会为每个字段错误抛出新的异常,而是将所有字段错误包装在单个Error对象中。可能存在全局对象错误,这是拒绝对象的全局原因。

因此,如果您想避免错误中的错误,则应修改ApiError类,将Exception error替换为List<Errors> errors并将其值设置为instance.errors

或者您可以使用自定义方法来解析错误: CodecLookup codecLookup

protected List retrieveErrors(instance) {

    CodecLookup codec = Holders.applicationContext.getBean(CodecLookup)

    List errors = []
    g.eachError([bean: instance], {
        error ->
            errors.add(codec.lookupDecoder('HTML').decode(g.message(error: error)))
    })

    return errors
}

g是每个控制器中可用的ValidationTagLib的命名空间。