2016-01-30 3 views
0

Dans Grails 2.3, je souhaite envoyer un message d'erreur personnalisé par JSON. Mais quand je l'utiliseErreurs ValidationException dans les erreurs

class ApiError { 
    String message 
    String status 
    Exception error 
} 

et essayer de l'analyser as JSON je reçois: (J'OMMISSIONS un message irrevelant et état)

"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] 
} 

Je ne comprends pas; quel est le point d'utiliser le tableau d'erreurs dans les erreurs? Et comment obtenir un seul tableau d'erreurs? Here est un code source de cette classe.

+0

Combien d'erreurs d'élément 'array' contient? Deux? Quel est le '' objet ''? "java.lang.Exception" '? – Armaiti

Répondre

1

Les erreurs de validation Grails contiennent à la fois des erreurs globales et des erreurs de champ. Chaque fois que l'exception de validation se produit dans grails, elle ne lance pas une nouvelle exception pour chaque erreur de champ, elle enveloppe plutôt toutes les erreurs de champ dans un seul objet Error. Il peut y avoir des erreurs globales d'objet, une raison globale pour rejeter un objet.

Donc, si vous voulez éviter les erreurs à l'intérieur des erreurs, vous devez modifier votre classe ApiError en remplaçant Exception error avec List<Errors> errors et la mise en valeur de sa instance.errors.

Ou vous pouvez utiliser une méthode personnalisée pour analyser les erreurs: 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 est l'espace de noms pour ValidationTagLib qui est disponible dans chaque contrôleur.