Validação personalizada MessageSource na inicialização por mola
1. Visão geral
MessageSource é um recurso poderoso disponível em aplicativos Spring. Isso ajuda os desenvolvedores de aplicativos a lidar com vários cenários complexos, escrevendo muito código extra, como configuração específica do ambiente, internacionalização ou valores configuráveis.
Mais um cenário pode ser modificar as mensagens de validação padrão para mais personalizadas / amigáveis.
Neste tutorial,we’ll see how to configure and manage custom validation MessageSource in the application using Spring Boot.
2. Dependências do Maven
Vamos começar adicionando as dependências Maven necessárias:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-validation
Você pode encontrar as versões mais recentes dessas bibliotecas emMaven Central.
3. Exemplo de mensagem de validação personalizada
Vamos considerar um cenário onde temos que desenvolver um aplicativo que suporte vários idiomas. Se o usuário não fornecer os detalhes corretos como entrada, gostaríamos de mostrar mensagens de erro de acordo com a localidade do usuário.
Vejamos um exemplo de um bean de formulário Login:
public class LoginForm {
@NotEmpty(message = "{email.notempty}")
@Email
private String email;
@NotNull
private String password;
// standard getter and setters
}
Aqui, adicionamos restrições de validação que verificam se um e-mail não é fornecido ou fornecido, mas não segue o estilo de endereço de e-mail padrão.
Para mostrar a mensagem personalizada e específica do local, podemos fornecer um espaço reservado conforme mencionado para a anotação@NotEmpty.
Aemail.notempty property será resolvida a partir de arquivos de propriedades pela configuraçãoMessageSource.
4. Defining the MessageSource * Feijão *
Um contexto de aplicativo delega a resolução da mensagem para um bean com o nome exatomessageSource.
ReloadableResourceBundleMessageSource é a implementaçãoMessageSource mais comum que resolve mensagens de pacotes de recursos para diferentes localidades:
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource
= new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
Aqui, é importante fornecerbasename, pois os nomes de arquivo específicos da localidade serão resolvidos com base no nome fornecido.
5. Definindo LocalValidatorFactoryBean
Para usar mensagens de nome personalizado em um arquivo de propriedades, como precisamos definir umLocalValidatorFactoryBeane registrar omessageSource:
@Bean
public LocalValidatorFactoryBean getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
No entanto, observe que se já tivéssemos estendidoWebMvcConfigurerAdapter, para evitar que o validador personalizado fosse ignorado, teríamos que definir o validador substituindo o métodogetValidator() da classe pai.
Agora podemos definir uma mensagem de propriedade como:
“email.notempty=<Custom_Message>”
ao invés de
“Javax.validation.constraints.NotEmpty.message =
6. Definindo Arquivos de Propriedades
A etapa final é criar um arquivo de propriedades no diretóriosrc/main/resources com o nome fornecido embasename na etapa 4:
# messages.properties
email.notempty=Please provide valid email id.
Aqui podemos tirar proveito da internacionalização junto com isso. Digamos que queremos mostrar mensagens para um usuário francês em seu idioma.
Neste caso, temos que adicionar mais um arquivo de propriedade com o nome demessages_fr.properties no mesmo local (nenhuma alteração de código necessária):
# messages_fr.properties
email.notempty=Veuillez fournir un identifiant de messagerie valide.
7. Conclusão
Neste artigo, abordamos como as mensagens de validação padrão podem ser alteradas sem modificar o código, se a configuração for feita corretamente com antecedência.
Também podemos aproveitar o suporte à internacionalização junto com isso para tornar o aplicativo mais fácil de usar.
Como sempre, o código-fonte completo está disponívelover on GitHub.