7
votes

Ne peut pas obtenir de validateur hibernate travaillant avec SpringSource

J'essaie d'obtenir une configuration de validateur Hibernate pour utiliser des messages d'une messagerie de printemps. J'ai la configuration suivante dans mon messages-context.xml : xxx

J'ai essayé une variété d'approches pour passer la touche de message du validateur Hibernate (à la fois avec et sans enfermer {} et aussi sans spécification d'une clé personnalisée - à l'aide de la valeur par défaut: xxx

mon validation_errors_en_gb.properties ressemble à Ceci: xxx

Cependant, lorsque les champs vides sont validés, les messages affichés sont ceci: xxx

pour une raison quelconque , la clé du message est toujours utilisée - le message réel n'est jamais levé. N'importe quelle idée où je vais mal?

Merci,

Russell


3 commentaires

J'utilise: Printemps 3.05, Validateur Hibernate 4.2.0.Finale, Hibernate-Core 3.3.2.ga et hibernate-annotations 3.4.0.ga


J'ai essayé d'utiliser de nouvelles versions de hibernate-core et d'annotations, et je reçois un java.lang.incompatibleclasschangeError: classe d'implémentation lorsque vous essayez de créer la sessionFactory, ce qui me suggère une sorte d'incompatibilité entre les versions - mais de quoi? Des idées?


Tout le monde mentionne comment configurer le printemps pour connaître le validateur Hibernate et la source de messages, le besoin ici est de laisser Hibernate savoir à choisir la source de message Springs au lieu de son propre fichier de validationProperties.


6 Réponses :


1
votes

Validator Hibernate regrette dans un endroit différent pour les paramètres régionaux. Essayez ceci:

localecontextholder.setlocale (locale);


1 commentaires

Définissez-le où? Dans la méthode du contrôleur? J'ai donné ça aller mais ça n'avait eu aucun effet, malheureusement. Merci pour la suggestion cependant.



13
votes

Cela m'avait soulevé pendant un moment, mais le problème est que vous devez vous inscrire au printemps, le validateur utilisé pour valider les méthodes de contrôle @Controller (grâce à Cette réponse pour cette perspective!)

Donc, si vous utilisez XML config, faites quelque chose sur ces lignes: P>

@EnableWebMVC
@Configuration
public MyWebAppContext extends WebMvcConfigurerAdapter {

@Bean
public LocalValidatorFactoryBean validator() {
    LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean();
    validatorFactoryBean.setValidationMessageSource(messageSource);
    return validatorFactoryBean;
}

@Override
public Validator getValidator() {
    return validator();
}


3 commentaires

Merci pour votre réponse - je l'ai prévu plutôt que de l'accepter, comme après avoir posté cette question, j'ai quitté Java, donc je n'ai plus la configuration requise pour le tester. Il "regarde" comme une bonne réponse, alors quand je reçois le temps de le tester, je le ferai, puis acceptez-le.


En fait, je pourrais prendre cela - quelle est la différence entre votre suggestion et ce qui est déjà dans mon messages-context.xml ?


Parce que vous devez expliquer explicitement le printemps que le bean de validateur à utiliser pour la validation MVC. Juste avoir un validateur flottant dans le contexte de l'application ne suffit pas.



4
votes

C'est parce que Validator Hibernate examine un autre endroit pour le résolveur du message d'erreur.

Pour la chose la plus facile à faire fonctionne, je pense que vous pouvez créer un nom de fichier " validationmessages.properties " et mettez-le dans votre dossier de classe. Ensuite, mettez les messages d'erreur dans ce fichier (obtenu à partir de validation_errors_en_gb.properties )

Au fait, les supports sont nécessaires lors de la spécification des messages d'erreur dans les classes de modèle ( message = "{validation.too.long}" )


0 commentaires

2
votes

La validation hibernate n'est pas au courant de la messagerie de printemps. Vous devrez mettre en œuvre un MessagePolorator. Il peut ressembler à quelque chose comme ci-dessous:

public class SpringMessageInterpolator implements MessageInterpolator {

    private final MessageResource messageResource;
    private final MessageInterpolator delegate;

    public SpringMessageInterpolator(MessageResource messageResource, MessageInterpolator delegate) {
        this.messageResource = messageResource;
        this.delegate = delegate;
    }

    @Override
    public String interpolate(String messageTemplate, Context context) {
        Locale locale = Locale.getDefault();
        return interpolate(messageTemplate, context, locale);
    }

    @Override
    public String interpolate(String messageTemplate, Context context, Locale locale) {
        try {
            Object[] args = {};
            return databaseMessageResource.getMessage(messageTemplate, args, locale);
        } catch (NoSuchMessageException ex) {
            return delegate.interpolate(messageTemplate, context, locale);
        }
    }

}


0 commentaires

0
votes

Cela a fonctionné pour moi. xxx


0 commentaires

0
votes

Par défaut Validateur Hibernate Strong> S (ou mieux à dire MessageInterpolator em>) vérifie validationmessages.properties code> et printemps strong> checks messages.properties code> pour résoudre les messages de validation.

Dans le domaine du ressort, vous pouvez configurer ces fichiers comme suit (Supposons que les messages sont stockés dans le fichier personnalisévalidationmessages.properties code> fichier et ce fichier est situé dans le répertoire i18n code>): p> xxx pré>

Remarque: faites attention aux importations mentionnées dans la section Commentaire. p>

entité de catégorie forte> (comme exemple): p> xxx pré>

personnalisévalidationmessages.properties strong> qui détient des messages de validation:

interpolated: This filed cannot be empty
non interpolated: {required.field.error}


0 commentaires