Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Spring Boot 2.0.2 - Validação de Mensagens dos Campos

Boa tarde, estou com um problema ao tentar exibir uma messagem do meu messages.properties quando é lançado uma exceção de ConstraintViolationException. Eu tenho essa mensagem :

ConstraintViolationImpl{interpolatedMessage='{validation.social-name}', propertyPath=socialName, rootBeanClass=class com.example.app.models.entities.Company, messageTemplate='{validation.social-name}'}

Mas na minha messages.properties eu tenho ela definida como:

validation.social-name=Razão social não pode ser branco

Segue o código abaixo:

@SpringBootApplication
public class App {

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

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

    public static void main(String[] args) {
        SpringApplication.run(App .class, args);
    }

}
@Entity
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    @CNPJ
    private String cnpj;

    @Column(nullable = false)
    @NotBlank(message = "{validation.social-name}")
    private String socialName;

}

Queria saber também se dessa forma é uma boa pática de desenvolvimento colocar mensagens de retorno para o meu úsuario no modelo da aplicação, ou se tem uma melhor forma de gerenciar esses retornos.

2 respostas
solução!

Fala Alex, tudo bem ?

Cara, tem um forma mais fácil de resolver essa questão. Como o Spring está completamente integrado à bean validation você nem precisa definir a chave que vai ser exposta no erro de validação @NotBlank(message = "{validation.social-name}"). Poderia deixar somente @NotBlank.

Em geral essa estratégia de expressar a chave é usada quando temos o arquivo de properties da própria espec da Bean Validation que eles chamam de ValidationMessages.properties. Mas como você está usando o MessageSource do Spring ele já adiciona alguns padrões de chave pra você quando o erro é percebido. Por exemplo, para o seu campo socialName da company que você deve receber em alguma action do controller assim: public String myAction(@Valid Company company) { ... }; o Spring já vai adicionar como chave desse field error a string NotBlank.company.socialName. Seguindo esse padrão no messages.properties a mensagem que você escreveu já deve ser utilizada.

messages.properties

NotBlank.company.socialName=Razão social não pode ser branco

Dê uma olhada nisso.

Espero ter ajudado. Abraço!

Bom dia, muito obrigado pela ajuda. Deu certo, estou me aprofundando no mundo do Spring e boas práticas. Sua resposta ajudou demais nisso, abraço.