1

J'ai une application démarrage de ressort qui a le point final suivant:Gestion des exceptions au démarrage du printemps

@RequestMapping("/my-end-point") 
public MyCustomObject handleProduct(
    @RequestParam(name = "productId") String productId, 
    @RequestParam(name = "maxVersions", defaultValue = "1") int maxVersions, 
){ 
    // my code 
} 

Cela devrait traiter les demandes de la forme

/my-end-point?productId=xyz123&maxVersions=4 

Cependant, quand je précise maxVersions=3.5, cela jette NumberFormatException (pour une raison évidente). Comment puis-je gérer gracieusement ce NumberFormatException et renvoyer un message d'erreur?

Répondre

4

Vous pouvez définir un ExceptionHandler dans le même contrôleur ou dans un ControllerAdvice qui gère l'exception MethodArgumentTypeMismatchException:

@ExceptionHandler(MethodArgumentTypeMismatchException.class) 
public void handleTypeMismatch(MethodArgumentTypeMismatchException ex) { 
    String name = ex.getName(); 
    String type = ex.getRequiredType().getSimpleName(); 
    Object value = ex.getValue(); 
    String message = String.format("'%s' should be a valid '%s' and '%s' isn't", 
            name, type, value); 

    System.out.println(message); 
    // Do the graceful handling 
} 

Si lors de la résolution de l'argument de la méthode du contrôleur, Spring détecte une incompatibilité de type entre le type d'argument de la méthode et la valeur réelle tapez, il soulèverait un MethodArgumentTypeMismatchException. Pour plus de détails sur la façon de définir un ExceptionHandler, vous pouvez consulter le documentation.