2016-12-06 7 views
1

J'ai un avis de contrôleur qui gère toutes les exceptions de validation lancées par mon application comme indiqué ci-dessous. A ma manière, je voudrais créer un filtre qui fera une validation à chaque demande et jettera une exception personnalisée quand cela sera nécessaire. Mais la chose est que je ne peux pas jeter exception personnalisée comme le montre ci-dessous. Comment puis-je lancer l'exception ValidationErrorException dans ce cas ou il existe d'autres meilleures façons de gérer une telle tâche.Le filtre de rappel déclenche une exception personnalisée

+0

Oui, vous pouvez ... Il doit juste être soit une exception RuntimeException ou une exception ServletException. Cela n'a rien à voir non plus avec Spring mais l'API Servlet générale (ou même la programmation java générale). –

Répondre

2

Les validations sont généralement effectuées sur les objets de requête qui sont généralement disponibles dans la couche Controller après qu'ils soient transformed du format de requête au format de traitement du serveur. par exemple. JSON vers l'objet Java. La validation doit donc être exécutée ou déclenchée sur la couche Controller une fois la demande atteinte en complétant l'ensemble de la chaîne filter.

Toute exception de validation lancée alors plus tard peut être manipulé dans votre gestionnaire suivant,

@RestControllerAdvice 
public class RestApiExceptionController { 

    @ExceptionHandler(ValidationErrorException.class) 
    public ResponseEntity<?> appNotFoundException(ValidationErrorException exception) { 
     return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) 
      .body(new ErrorResponse(exception.getErrorCode(), exception.getMessage())); 
    } 
} 

Le très one du but de filters est,

Pour intercepter les demandes d'un client avant ils accèdent à une ressource au back end.

filtres Donc, en temps réel n'ont pas la ressource réelle encore à valider. Ils sont disponibles une fois que le contrôle atteint pour corriger component et dans votre cas, il est Controller.

Il est donc préférable de ne pas effectuer de validations basées sur resource sur les composants filter.

+0

Vous avez raison. Mais qu'en est-il lorsque j'ai besoin d'un utilisateur pour attacher un code secret chiffré à l'en-tête HTTP et que le filtre doit valider chaque requête et lancer ValidationErrorException si le secret n'est pas valide? –

+0

@ChhornPonleu encore une fois c'est plus de décisions de conception. Veuillez rechercher le module Spring Security. Vous êtes ici en train de faire une autorisation/authentification sur demande. Il a toutes ces fonctionnalités liées à la sécurité disponibles. Donc, jetez des exceptions de sécurité et non des exceptions de validation. – ScanQR

+0

Il semble que Spring Security ait plus de fonctionnalités que ce dont j'ai besoin. C'est pourquoi je cherche une solution très simple. –