À l'aide de Spring MVC, l'acceptation de requêtes POST avec un serveur JSON incorrect entraîne la redirection d'une page de serveur de code d'erreur 400 par défaut

Je suis en train de travailler sur une api REST. La réception d'un message avec une mauvaise JSON (par exemple, { sdfasdfasdf } ) causes de Printemps, pour revenir à la valeur par défaut du serveur de la page pour un 400 Bad Request Error. Je ne veux pas retourner une page, je souhaite retourner un JSON personnalisé objet d'Erreur.

Je peux faire quand il y a une exception à l'aide d'un @ExceptionHandler. Donc, si c'est un vide de demande ou d'un vide d'objet JSON (par exemple, { } ), il va lancer une exception NullPointerException et je peux l'attraper avec mes ExceptionHandler et faire ce qui me plaît.

Le problème, alors, est que le Printemps ne fait pas lever une exception quand il est juste de syntaxe non valide... au moins pas ce que je peux voir. Il renvoie simplement la page d'erreur par défaut du serveur, si c'est Tomcat, Glassfish, etc.

Donc ma question est comment puis-je "intercepter" du Printemps et de l'amener à utiliser mon gestionnaire d'exception ou autrement empêcher la page d'erreur de l'affichage et au lieu de retourner une erreur JSON objet?

Voici mon code:

@RequestMapping(value = "/trackingNumbers", method = RequestMethod.POST, consumes = "application/json")
@ResponseBody
public ResponseEntity<String> setTrackingNumber(@RequestBody TrackingNumber trackingNumber) {

    HttpStatus status = null;
    ResponseStatus responseStatus = null;
    String result = null;
    ObjectMapper mapper = new ObjectMapper();

    trackingNumbersService.setTrackingNumber(trackingNumber);
    status = HttpStatus.CREATED;
    result = trackingNumber.getCompany();


    ResponseEntity<String> response = new ResponseEntity<String>(result, status);

    return response;    
}

@ExceptionHandler({NullPointerException.class, EOFException.class})
@ResponseBody
public ResponseEntity<String> resolveException()
{
    HttpStatus status = null;
    ResponseStatus responseStatus = null;
    String result = null;
    ObjectMapper mapper = new ObjectMapper();

    responseStatus = new ResponseStatus("400", "That is not a valid form for a TrackingNumber object " + 
            "({\"company\":\"EXAMPLE\",\"pro_bill_id\":\"EXAMPLE123\",\"tracking_num\":\"EXAMPLE123\"})");
    status = HttpStatus.BAD_REQUEST;

    try {
        result = mapper.writeValueAsString(responseStatus);
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    ResponseEntity<String> response = new ResponseEntity<String>(result, status);

    return response;
}

source d'informationauteur UpAllNight | 2013-06-19