Guia para ParameterMessageInterpolator

Guia para ParameterMessageInterpolator

1. Visão geral

Um dos recursos do Java JSR 380 é permitir expressões enquanto interpola as mensagens de validação com os parâmetros.

Quando usamos o Hibernate Validator,there is a requirement that we need to add one of the uniform implementations of Java JSR 341 as a dependency to our project. JSR 341 também é chamado de Expression Language API.

No entanto, adicionar uma biblioteca extra pode ser complicado se não precisarmos suportar expressões de análise de acordo com nosso caso de uso.

Neste breve tutorial, daremos uma olhada em como configurarParameterMessageInterpolator no Hibernate Validator.

2. Interpoladores de mensagens

Além dethe basics of validating a Java bean, oMessageInterpolator da Bean Validation API é uma abstração que nos dá uma maneira de realizar interpolações simples sem o incômodo de analisar expressões.

Além disso,Hibernate Validator offers a non-expression based ParameterMessageInterpolator, and therefore, we don’t need any extra libraries to configure it.

3. Configurando interpoladores de mensagens personalizadas

Para remover a dependência da linguagem de expressão, podemos usar interpoladores de mensagens personalizados e configurar o Hibernate Validator sem suporte à expressão.

Vamos mostrar algumas das maneiras convenientes de configurar interpoladores de mensagens personalizados. Usaremos oParameterMessageInterpolator integrado em nosso caso.

3.1. ConfigurandoValidatorFactory

Uma maneira de configurar um interpolador de mensagem personalizado é configurarValidatorFactory durante a inicialização.

Assim, podemos construir uma instânciaValidatorFactory comParameterMessageInterpolator:

ValidatorFactory validatorFactory = Validation.byDefaultProvider()
  .configure()
  .messageInterpolator(new ParameterMessageInterpolator())
  .buildValidatorFactory();

3.2. ConfigurandoValidator

Da mesma forma, podemos definirParameterMessageInterpolator quando inicializamos a instânciaValidator:

Validator validator = validatorFactory.usingContext()
  .messageInterpolator(new ParameterMessageInterpolator())
  .getValidator();

4. Executando validações

Para ver comoParameterMessageInterpolator funciona, precisamos de um Java bean de amostra com algumas anotações JSR 380 nele.

4.1. Amostra de Java Bean

Vamos definir nosso exemplo de Java beanPerson:

public class Person {

    @Size(min = 10, max = 100, message = "Name should be between {min} and {max} characters")
    private String name;

    @Min(value = 18, message = "Age should not be less than {value}")
    private int age;

    @Email(message = "Email address should be in a correct format: ${validatedValue}")
    private String email;

    // standard getters and setters
}

4.2. Testando parâmetros de mensagem

Certamente, para realizar nossas validações, devemos usar uma instânciaValidator acessada deValidatorFactory, que já configuramos antes de.

Então, precisamos acessar nossoValidator:

Validator validator = validatorFactory.getValidator();

Depois disso, podemos escrever nosso método de teste para o camponame:

@Test
public void givenNameLengthLessThanMin_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Doe");
    person.setAge(18);

    Set> violations = validator.validate(person);

    assertEquals(1, violations.size());

    ConstraintViolation violation = violations.iterator().next();

    assertEquals("Name should be between 10 and 100 characters", violation.getMessage());
}

A mensagem de validação é interpolada com variáveis ​​de{min}e{max} corretamente:

Name should be between 10 and 100 characters

A seguir, vamos escrever um teste semelhante para o campoage:

@Test
public void givenAgeIsLessThanMin_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Stephaner Doe");
    person.setAge(16);

    Set> violations = validator.validate(person);

    assertEquals(1, violations.size());

    ConstraintViolation violation = violations.iterator().next();

    assertEquals("Age should not be less than 18", violation.getMessage());
}

Da mesma forma, a mensagem de validação é interpolada corretamente com a variável{value} como esperávamos:

Age should not be less than 18

4.3. Testando expressões

Para ver comoParameterMessageInterpolator se comporta com expressões, vamos escrever outro teste para o campoemail que envolve uma expressão${validatedValue} simples:

@Test
public void givenEmailIsMalformed_whenValidate_thenValidationFails() {
    Person person = new Person();
    person.setName("John Stephaner Doe");
    person.setAge(18);
    person.setEmail("johndoe.dev");

    Set> violations = validator.validate(person);

    assertEquals(1, violations.size());

    ConstraintViolation violation = violations.iterator().next();

    assertEquals("Email address should be in a correct format: ${validatedValue}", violation.getMessage());
}

Desta vez, a expressão${validatedValue} não é interpolada.

ParameterMessageInterpolator only supports the interpolation of parameters, not parsing expressions that use the $ notation. Em vez disso, ele simplesmente os retorna não interpolados.

5. Conclusão

Neste artigo, aprendemos para que serveParameterMessageInterpolator e como configurá-lo no Hibernate Validator.

Como sempre, todos os exemplos envolvidos neste tutorial estão disponíveisover on GitHub.