Spring MVC + Hibernate: les données des stratégies de validation

Nous le savons tous, Spring MVC, s'intègrent bien avec Hibernate Validator et de la JSR-303 en général. Mais Hibernate Validator, comme quelqu'un l'a dit, est quelque chose de Bean Validation uniquement, ce qui signifie que de plus en plus complexe des validations doit être poussé à la couche de données. Des exemples de telles validations: entreprise clé de l'unicité, de l'intra-dossiers de dépendance (ce qui est généralement quelque chose de pointer les DB des problèmes de conception, mais nous vivons dans un monde imparfait). Même de simples validations comme chaîne de caractères de longueur peut être déterminé par une valeur en DB, ce qui rend Hibernate Validator inutilisable.

Donc ma question est, est-il quelque chose de Printemps ou mise en veille prolongée ou JSR vous propose d'effectuer des complexes telles validations? Est-il un établi motif ou la pièce de technologie pour effectuer une telle validation dans un Contrôleur standard-Service-Référentiel de configuration basé sur Spring et Hibernate?

Mise à JOUR: Permettez-moi d'être plus précis. Par exemple, il y a un formulaire qui envoie une requête AJAX enregistrer la demande au contrôleur de save méthode. Si certains d'erreur de validation de produit, simple ou "complexe", nous devrions revenir au navigateur avec quelques json indiquant un champ problématique et d'erreur associé. Pour de simples erreurs que je peux extraire le champ (le cas échéant) et le message d'erreur de BindingResult. Quelles sont les infrastructures (peut-être, et non pas ad-hoc des exceptions?) voulez-vous proposer pour le "complexe" des erreurs? À l'aide de gestionnaire d'exception ne semble pas être une bonne idée pour moi, parce que la séparation même processus de validation entre save méthode et @ExceptionHandler rend les choses complexes. Actuellement j'utilise ad-hoc exception (comme, ValidationException):

public @ResponseBody Result save(@Valid Entity entity, BindingResult errors) {
    Result r = new Result();
    if (errors.hasErrors()) {
        r.setStatus(Result.VALIDATION_ERROR);     
        //...   
    } else {
        try {
            dao.save(entity);
            r.setStatus(Result.SUCCESS);
        } except (ValidationException e) {
            r.setStatus(Result.VALIDATION_ERROR);
            r.setText(e.getMessage());
        }
    }
    return r;
}

Peut vous offrir encore plus optimale approche?