Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Reaproveitar Bean Validations

1) Gostaria de saber se é possível reaproveitar as Beans Validations para não precisar repetir o mesmo pattern direto em todo Dto que necessitar de validações.

Por exemplo, assim é como está hoje:

public record MedicoDto(
        @NotBlank String nome,
        @NotBlank @Email String email,
        @NotBlank @Pattern(regexp = "\\d{8,13}") String telefone,
        @NotBlank @Pattern(regexp = "\\d{4,6}") String crm,
        @NotNull Especialidade especialidade,
        @NotNull @Valid EnderecoDto endereco) {
}
public record MedicoAtualizarDto(
        @NotNull Long id,
        String nome,
        @Pattern(regexp = "\\d{8,13}") String telefone,
        @Valid EnderecoDto endereco) {
}

Repare que o Pattern para o campo telefone se repete em ambos os Dtos. Logo, seria possível criar um template para esses Patterns recorrentes em um arquivo properties ou algo do tipo?

Algo como:

public record MedicoAtualizarDto(
        @Pattern(template = "telefone") String telefone,
        @Pattern(template = "crm") String crm,
}

2) Ou ainda, faria sentido adicionar as validações na própria Entity? Assim, não seria necessário ficar repetindo as validações que serão comuns para todos os Dtos

1 resposta
solução!

Olá Matheus, tudo bem?

Sobre a sua primeira dúvida, é possível sim reaproveitar as Beans Validations para evitar a repetição do mesmo pattern em todo Dto que necessitar de validações. Uma forma de fazer isso é criando uma interface que contenha as validações comuns e implementando-a nas classes que precisam dessas validações.

Por exemplo:

public interface TelefoneValido {
    @NotBlank
    @Pattern(regexp = "\\d{8,13}")
    String getTelefone();
}

public record MedicoDto(
        @NotBlank String nome,
        @NotBlank @Email String email,
        @NotNull Especialidade especialidade,
        @NotNull @Valid EnderecoDto endereco,
        implements TelefoneValido) {
}

public record MedicoAtualizarDto(
        @NotNull Long id,
        String nome,
        @Valid EnderecoDto endereco,
        implements TelefoneValido) {
}

Dessa forma, a validação de telefone é definida apenas uma vez na interface TelefoneValido e pode ser reutilizada em outras classes que implementam essa interface.

Já sobre a sua segunda dúvida, adicionar as validações na própria Entity pode ser uma opção, mas é importante lembrar que as validações de entrada de dados devem ser feitas nos Dtos e não nas entidades. Isso porque as entidades representam a estrutura de dados do seu sistema e não necessariamente refletem os dados recebidos na entrada. Além disso, as validações nos Dtos permitem que você tenha mais controle sobre as mensagens de erro e possa personalizá-las de acordo com o contexto da sua aplicação.

Espero ter ajudado e bons estudos!