2017-07-28 1 views
1

Je suis en train de concevoir un POJO pour les scénarios d'erreur personnalisés de mes méthodes @RequestMapping.Quelle classe de modèle est utilisée pour les réponses d'erreur des méthodes de mappage de requête?

printemps par défaut jette un HttpMessageNotReadableException si un POST est faite sans corps et renvoie la réponse d'erreur très bien que quelque chose comme ceci:

{ 
    "timestamp": "2017-07-28T18:54:11.867+0000", 
    "status": 400, 
    "error": "Bad Request", 
    "exception": "org.springframework.http.converter.HttpMessageNotReadableException", 
    "message": "Required request body is missing: public org.springframework.http.ResponseEntity<some.package.name.SomeResponseClass> some.package.name.SomeControllerClass.someRequestMappingMethod(java.util.Map<java.lang.String, java.lang.String>, some.package.name.SomeRequestClass)", 
    "path": "/somepath/" 
} 

De même, si la validation pour un champ annotée avec @Valid échoue, il jette MethodArgumentNotValidException et renvoie la réponse d'erreur comme:

{ 
    "timestamp": "2017-07-28T17:23:53.102+0000", 
    "status": 400, 
    "error": "Bad Request", 
    "exception": "org.springframework.web.bind.MethodArgumentNotValidException", 
    "errors": [ 
     { 
      "codes": [ 
       "NotNull.incident.someField", 
       "NotNull.someField", 
       "NotNull.java.lang.String", 
       "NotNull" 
      ], 
      "arguments": [ 
       { 
        "codes": [ 
         "someObject.someField", 
         "someField" 
        ], 
        "arguments": null, 
        "defaultMessage": "someField", 
        "code": "someField" 
       } 
      ], 
      "defaultMessage": "someField is null", 
      "objectName": "someObject", 
      "field": "someField", 
      "rejectedValue": null, 
      "bindingFailure": false, 
      "code": "NotNull" 
     } 
    ], 
    "message": "Validation failed for object='someObject'. Error count: 2", 
    "path": "/somepath/" 
} 

Je l'avoir entendu que soit du ressort de cas ci-dessus doit être un retour ResponseEntity objet avec les en-têtes et le corps enveloppé dans celui-ci. Et il doit y avoir une classe de modèle représentant le corps ayant des champs comme ci-dessus timestamp, status, error etc. Je voulais juste visiter cette classe pour avoir une idée de ce que tous les champs Spring ont inclus dans leur modèle de réponse aux erreurs. Ou peut-être que je pourrais vouloir l'étendre. J'ai passé pas mal de temps à chercher ce cours, mais je n'ai pas pu le trouver.

Le meilleur que j'ai pu trouver est ResponseEntityExceptionHandler#handleException(), mais mon débogueur ne va même pas aller au point de rupture là !!

Quelqu'un peut-il me diriger vers l'emballage où il existe?

Répondre

1

pour le printemps Boot 1.5.2.RELEASE/Spring 4.3.7

Il est un LinkedHashMap<String, Object>.

Je l'ai trouvé en recherchant ErrorController - Il y a une classe org.springframework.boot.autoconfigure.web.BasicErrorController

Il est la méthode error est appelée lorsqu'une occurres d'erreur et il ressemble à ceci:

@RequestMapping 
@ResponseBody 
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { 
    Map<String, Object> body = getErrorAttributes(request, 
      isIncludeStackTrace(request, MediaType.ALL)); 
    HttpStatus status = getStatus(request); 
    return new ResponseEntity<Map<String, Object>>(body, status); 
} 

Vous pouvez creuser dans le mehod getErrorAttributes à Découvrez comment la carte est construite.

1

classe suivante vous donnera idée sur la façon dont la réponse est générée en cas d'erreur org.springframework.boot.autoconfigure.web.DefaultErrorAttributes

Référence:

Modify default JSON error response from Spring Boot Rest Controller

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling

Si vous souhaitez personnaliser la réponse en cas d'erreur, vous pouvez également utiliser l'approche suivante: @ControllerAdvice ainsi que @ExceptionHandler

Une autre classe de se référer pour la gestion des erreurs org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler

+0

Cela a été utile, Merci. –

+0

+1 pour les liens externes. Cependant, les deux réponses ici sont également utiles pour moi et je ne peux en accepter qu'une seule. Donc, j'accepte celui qui a été répondu en premier. :) –