1
resposta

Construtor do Record e contexto do Spring

Professor Rodrigo,

Notei que ao deixar o construtor privado do record responsavel por transformar a lista de mensagens de erro do bean validation, o mesmo nao e instanciado e usado, isso e por conta do contexto do spring ? o container tem que ter a visao publica do construtor do record para conseguir instancia-lo e injeta-lo ?

package med.voll.api.infra;

import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;


@RestControllerAdvice
public class RestControllerExceptionHandler {

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity handle404() {
        return ResponseEntity.notFound().build();
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity handle400(MethodArgumentNotValidException exception) {
        var errors = exception.getFieldErrors();
        return ResponseEntity.badRequest().body(
                errors.stream().map(DataNotValid::new).toList()
        );
    }

    private record DataNotValid(String field, String message) {
        public DataNotValid(FieldError error) {
            this(error.getField(), error.getDefaultMessage());
        }
    }

}

Obrigado

1 resposta

Acredito que sim, tem que deixar o construtor público, mas isso é mais o contexto do java e não do Spring.

Pois se deixarmos o construtor privado, apenas o record DataNotValid poderia utilizar o próprio construtor, nesse caso citado acima O record DataNotValid não é privado para a classe RestControllerExceptionHandler logo ele pode instanciar pelo construtor público.