Spring MVC + Hibernate: estratégias de validação de dados

Todos nós sabemos que o Spring MVC integra-se bem ao Hibernate Validator e ao JSR-303 em geral. Mas o Hibernate Validator, como alguém disse, é algo somente para Bean Validation, o que significa que validações mais complexas devem ser enviadas para a camada de dados. Exemplos de tais validações: unicidade de chave de negócios, dependência de registros internos (que geralmente é algo que aponta para problemas de design de banco de dados, mas todos nós vivemos em um mundo imperfeito). Mesmo validações simples, como o tamanho do campo de string, podem ser determinadas por algum valor de DB, o que torna o Hibernate Validator inutilizável.

Então, minha pergunta é: existe algo que o Spring, o Hibernate ou o JSR oferece para realizar validações tão complexas? Existe algumestabelecido padrão ou peça de tecnologia para executar tal validação em uma configuração padrão de Repositório de Serviço de Controlador com base no Spring e no Hibernate?

ATUALIZAR: Deixe-me ser mais específico. Por exemplo, há um formulário que envia uma solicitação de salvamento AJAX ao controladorsave método. Se algum erro de validação ocorrer - seja simples ou "complexo" - devemos voltar ao navegador com algum json indicando um campo problemático e um erro associado. Para erros simples eu posso extrair o campo (se houver) e mensagem de erroBindingResult. Que infra-estrutura (talvez exceções específicas, não ad-hoc?) Você propõe para erros "complexos"? Usar o manipulador de exceção não parece ser uma boa ideia para mim, porque separar um único processo de validação entresave método e@ExceptionHandler torna as coisas intrincadas. Atualmente eu uso alguma exceção ad-hoc (como,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;
}

Você pode oferecer uma abordagem mais otimizada?

questionAnswers(1)

yourAnswerToTheQuestion