2016-01-30 4 views
0

В grails 2.3, я хочу отправить настроенное сообщение об ошибке JSON. Но когда я используюValidationException ошибки в ошибках

class ApiError { 
    String message 
    String status 
    Exception error 
} 

и попытаться разобрать его as JSON я получаю: (I ommit irrevelant сообщение и статус)

"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 является исходным кодом данного класса.

+0

Сколько содержится в массиве элементов 'array'? Два? Что такое «объект»? ' "Java.lang.Exception"'? – Armaiti

ответ

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, который доступен в каждом контроллере.

Смежные вопросы