2
respostas

Validaçạo de API

Olá, Vi na internet e em um tópico desse fórum que para criar validações customizadas , normalmente se cria uma anotação e uma outra classe para a regra de validação. Porém achei um pouco complexo e trabalhoso. Nos estudos que fiz a alguns meses de Spring MVC vi que as validaçoes customizadas de formulário são feitas criando uma classe que implementa a interface Validator do spring, onde estaria a regra de validaçao, e registrando esse validador no controller. Testei essa solução para uma API e funcionou legal. O validador disparou um MethodArgumentNotValidException que foi tratado pelo ControllerAdvice normalmente. Essa seria uma solução válida também para validações customizadas? Teria alguma limitaçao? Poderia utilizá-la para validações customizadas de APIs? No caso de um objeto que possui duas datas(início e fim de vigencia) seria uma boa utilizar essa abordagem para validar se a data de início que está sendo passada é realmente anterior a data de fim?

public class Form {

    private String campo1;

    public String getCampo1() {
        return campo1;
    }

    public void setCampo1(String campo1) {
        this.campo1 = campo1;
    }
}
public class ValidacaoCustomizada implements Validator{
    @Override
    public boolean supports(Class<?> clazz) {
        return Form.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors e) {
        e.rejectValue("campo1", "1", "Campo rejeitado");

    }
}
@Controller
@RequestMapping("/teste")    
public class TesteController {


    @PostMapping
    public ResponseEntity<String> teste(@RequestBody @Valid Form form){
        return ResponseEntity.ok("bla bla");
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new ValidacaoCustomizada());
    }
}
2 respostas

Por que não utilizar o padrão de custom validators do Spring? https://www.baeldung.com/spring-mvc-custom-validator

Boa tarde, cara pode ser usada sim, não vejo problema, porém a galera hoje em dia esta muito na pegada do DDD, Domain Driven Design, ou seja, esse tipo de validação no DDD provavelmente viraria um objeto (ex: Periodo), e dentro desse objeto ao ser populado o mesmo validaria nesse momento, logo você colocaria dentro do dominio a responsabilidade de saber se a data inicial é antes da final. Irei colocar um link abaixo do que estou falando.:

https://engineering.contaazul.com/ddd-com-jpa-8b4ee4c0a603