Pergunta

Estou tentando configurar uma fonte de mensagem personalizada para o Hibernate Validator 4.1 a Spring 3.0. Eu configurei a configuração necessária:

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

As traduções são servidas da minha fonte de mensagem, mas parece que os tokens de substituição nas próprias mensagens são procurados na fonte de mensagem, ou seja, para::

my.message=the property {prop} is invalid

Há chamadas para procurar 'suporte' no MessageSource. Indo à ResourceBundleMessageInterpolator.interpolateMessage Eu noto que os estados javadoc:

Executa a interpolação da mensagem de acordo com o algoritmo especificado no JSR 303.

Nota: As pesquisas nos pacotes de usuários são recursivas, enquanto as pesquisas no pacote padrão não são!

Isso me parece que a recursão sempre ocorrerá para um pacote especificado pelo usuário; portanto, na verdade, não posso traduzir mensagens padrão como a de tamanho.

Como posso conectar minha própria fonte de mensagem e poder ser substituído os parâmetros na mensagem?

Foi útil?

Solução

Isso me parece que a recursão sempre ocorrerá para um pacote especificado pelo usuário; portanto, na verdade, não posso traduzir mensagens padrão como a de tamanho.

O ResourceBundLemessageInterpolator do Validador do Hibernato Crie duas instâncias de ResourceBundLelocator (IE PlatformResourceBundLelocator) um para mensagens de validação definidas pelo usuário - UserResourcebundLelocator e outro para mensagens de validação padrão JSR -303 - DefinaultrresourcendLelocator.

Qualquer texto que apareça em dois aparelhos encaracolados, por exemplo {someText} na mensagem é tratada como substituto. ResourceBundLemessageInterpolator tenta encontrar o valor correspondente que pode substituir o substituto do ResourceBundLelocators.

  1. Primeiro em UserDefinedValidationMessages (que é recursivo),
  2. Então, em DefaultValidationMessages (que não é recursivo).

Então, se você colocar uma mensagem JSR-303 padrão em ResourceBundle personalizada, digamos, validation_erros.properties, ele será substituído por sua mensagem personalizada. Veja nisso EXEMPLO A mensagem de validação NotNull padrão 'pode não ser nula' foi substituída pela mensagem personalizada 'MyNotNullMessage'.

Como posso conectar minha própria fonte de mensagem e poder ser substituído os parâmetros na mensagem?
my.message = a propriedade {prop} é inválida

Depois de passar por ambos os ResourceBundLelocators, o ResourceBundLemessageInterpolator encontra mais replactekens na Magia Resolvido (resolvida por ambos os pacotes). Esses substitutos não são nada além do Nomes dos atributos da anotação, se tais replactekens forem encontrados na magia resolvida, eles são substituídos pelo valores de atributos de anotação correspondentes.

ResourcebundLemessageInterpolator.java [Linha 168, 4.1.0.Final

resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );

Fornecendo um exemplo para substituir {prop} pelo valor personalizado, espero que isso ajude você ....

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 

Teste

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());
    }
}

Resultado

Custom Message:- userName cannot be null
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top