Question

Je suis en train de mettre en place une source de message personnalisé pour Hibernate Validator 4.1 à Spring 3.0. J'ai mis en place la configuration nécessaire:

<!-- JSR-303 -->
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
 </bean>

Les traductions sont servis de ma source de message, mais il semble que les jetons de remplacement dans les messages eux-mêmes sont recherchés dans la source du message, à savoir pour:

my.message=the property {prop} is invalid

il y a des appels pour rechercher « prop » dans le MessageSource. Entrant dans ResourceBundleMessageInterpolator.interpolateMessage Je note que les Etats javadoc:

  

exécute l'interpolation de message selon l'algorithme spécifié dans JSR 303.

     

Note:   Look-ups en faisceaux utilisateur est récursive alors look-ups en paquet par défaut ne sont pas!

Cela ressemble à moi comme la récursion toujours lieu pour un ensemble spécifié par l'utilisateur, donc en effet je ne peux pas traduire les messages standard comme celui pour la taille.

Comment puis-je brancher dans ma propre source de message et être en mesure d'avoir des paramètres être remplacés dans le message?

Était-ce utile?

La solution

  

Cela ressemble à moi comme la récursion   toujours lieu pour une   ensemble spécifié par l'utilisateur, de sorte à effet I   ne peut pas traduire les messages standard   comme celui pour la taille.

ResourceBundleMessageInterpolator de mise en veille prolongée Validateur créer deux instances de ResourceBundleLocator (à savoir PlatformResourceBundleLocator) une pour les messages de validation UserDefined - userResourceBundleLocator et l'autre pour JSR-303 messages de validation standard -. DefaultResourceBundleLocator

Tout texte qui apparaît dans deux accolades par exemple {someText} dans le message est traité comme replacementToken. ResourceBundleMessageInterpolator essaie de trouver la valeur correspondante qui peut remplacer le replacementToken dans ResourceBundleLocators.

  1. première dans UserDefinedValidationMessages (qui est récursif),
  2. puis dans DefaultValidationMessages (ce qui est récursive).

Donc, si vous mettez un message standard JSR-303 dire ResourceBundle personnalisé, validation_erros.properties, il sera remplacé par votre message personnalisé. Voir dans ce Exemple validation standard NotNull message « ne peut pas être nul » a été remplacé par la coutume message 'MyNotNullMessage'.

  
    

Comment puis-je brancher dans mon propre message     la source et être en mesure d'avoir des paramètres     être remplacé dans le message?
    my.message = la propriété {prop} est     invalide

  

Après avoir traversé les deux ResourceBundleLocators, ResourceBundleMessageInterpolator découvertes pour plus replaceTokens dans le resolvedMessage (résolu par les deux faisceaux). Ces replacementToken ne sont que les noms des attributs de Annotation , si ces replaceTokens se trouvent dans le resolvedMessage, ils sont remplacés par les valeurs de Annotation correspondant attributs .

ResourceBundleMessageInterpolator.java [Ligne 168, 4.1.0.Final]

resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );

Fournir un exemple pour remplacer {prop} avec la valeur spécifique, je l'espère vous aider ....

MyNotNull.java

@Constraint(validatedBy = {MyNotNullValidator.class})
public @interface MyNotNull {
    String propertyName(); //Annotation Attribute Name
    String message() default "{myNotNull}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default {};
}

MyNotNullValidator.java

public class MyNotNullValidator implements ConstraintValidator<MyNotNull, Object> {
    public void initialize(MyNotNull parameters) {
    }

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
        return object != null;
    }
}

User.java

class User {
    private String userName;

    /* whatever name you provide as propertyName will replace {propertyName} in resource bundle */
   // Annotation Attribute Value 
    @MyNotNull(propertyName="userName") 
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
}

validation_errors.properties

notNull={propertyName} cannot be null 

test

public void test() {
    LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
    Validator validator = factory.getValidator();
    User user = new User("James", "Bond");
    user.setUserName(null);
    Set<ConstraintViolation<User>> violations = validator.validate(user);
    for(ConstraintViolation<User> violation : violations) {
        System.out.println("Custom Message:- " + violation.getMessage());
    }
}

Sortie

Custom Message:- userName cannot be null
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top