À 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
Vous devez vous connecter pour publier un commentaire.
Cela a été évoqué comme un problème avec le Printemps
SPR-enroulement 7439
- JSON (jackson) @RequestBody de triage throws exception maladroite qui a été fixé au Printemps 3.1M2 en ayant Printemps jeter unorg.springframework.http.converter.HttpMessageNotReadableException
dans le cas de manquant ou invalide corps du message.Dans votre code, vous ne pouvez pas créer un
ResponseStatus
puisqu'elle est abstraite, mais j'ai testé la capture de cette exception avec une méthode plus simple localement avec le Printemps 3.2.0.VERSION en cours d'exécution sur la Jetée 9.0.3.v20130506.et j'ai reçu un 400 statut "erreur" de la Chaîne de réponse.
Le défaut a été discuté sur cette Printemps post sur le forum.
Remarque: j'ai commencé à tester avec de la Jetée 9.0.0.M4 mais qui a eu quelques autres questions internes arrêt de la
@ExceptionHandler
remplir, donc, en fonction de votre conteneur (Jetty, Tomcat, autres), vous pourriez avoir besoin pour obtenir une version plus récente, qui joue bien avec n'importe quelle version de Printemps que vous utilisez.