2
respostas

ExceptionHandler

Olá a todos.

Quando estava usando Spring Boot com Java, no eu consegui pegar a validação de nome de campo. Exemplo tenho uma classe

 public class Carro{

     String nome;
     String cor;

 }

e digamos que vou mandar uma requisição via Postman para cadastrar um novo carro e bando e requisição via Body da sequente forma

{
    "nome" : "UNO",
    "corrr": "VERMELHO"
}

Como meu mandei um campo que não existe no casso corrr o Kotlin não consegue fazer a conversão automática e lança um erro.Em java eu conseguia pegar esse erro e responder uma requisição falando que o campo corrr não existe .

Eu utilizava assim. Existe algo semelhante em Kotlin que possa fazer ?

  @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
                                                                  HttpHeaders headers, HttpStatus status, WebRequest request) {
        Throwable rootCause = ExceptionUtils.getRootCause(ex);

        if (rootCause instanceof InvalidFormatException) {
            return handleInvalidFormat((InvalidFormatException) rootCause, headers, status, request);
        } else if (rootCause instanceof PropertyBindingException) {
            return handlePropertyBinding((PropertyBindingException) rootCause, headers, status, request);
        } else if (rootCause instanceof MethodArgumentNotValidException) {
            return handleMethodArgumentNotValid((MethodArgumentNotValidException) rootCause, headers, status, request);
        }

        ProblemType problemType = ProblemType.MENSAGEM_INCOMPREENSIVEL;
        String detail = "O corpo da requisição está inválido. Verifique erro de sintaxe.";

        Problem problem = createProblemBuilder(status, problemType, detail)
                .userMessage(MSG_ERRO_GENERICA_USUARIO_FINAL)
                .build();

        return handleExceptionInternal(ex, problem, headers, status, request);
    }
 private ResponseEntity<Object> handlePropertyBinding(PropertyBindingException ex,
                                                         HttpHeaders headers, HttpStatus status, WebRequest request) {

        String path = joinPath(ex.getPath());


        ProblemType problemType = ProblemType.MENSAGEM_INCOMPREENSIVEL;
        String detail = String.format("A propriedade '%s' não existe. "
                + "Corrija ou remova essa propriedade e tente novamente.", path);

        Problem problem = createProblemBuilder(status, problemType, detail)
                .userMessage(MSG_ERRO_GENERICA_USUARIO_FINAL)
                .build();

        return handleExceptionInternal(ex, problem, headers, status, request);
    }
private String joinPath(List<Reference> references) {
    return references.stream()
            .map(ref -> ref.getFieldName())
            .collect(Collectors.joining("."));
}
2 respostas

Oi Junior,

Na verdade o Spring Boot vai ignorar as propriedades que forem enviadas no json e não existirem nas classes.

Somente acontece erro se você mandar um tipo inválido, por exemplo, tem um atributo Integer e no json é enviado um texto contendo letras.

Olá Rodrigo Ferreira, Obrigado pela resposta. Quando eu estava usando Spring Boot com Java, utilizamos uma extensão da classe ResponseEntityExceptionHandler, ja trazia algumas métodos que que poderíamos sobre escrever. com a lang3 eu conseguia pegar o erro dos campo.

Classe DTO

data class Teste(
    @field:NotEmpty
    var nome: String,
    @field:NotEmpty
    var idade: String
)

Contoller

@RestController
@RequestMapping("/teste")
class TesteController {

    @PostMapping
    fun teste(@RequestBody @Valid teste: Teste): ResponseEntity<Any> {

        println(teste)
        return ResponseEntity.status(HttpStatus.OK).body("OK")
    }
}

Requisição o erro que e foi enviado idad no lugar de idade

{
    "nome" : "aaa",
    "idad" : "aaaa"
}

Erro

2022-08-17 10:28:00.441  WARN [,0d95843157bc4067,0d95843157bc4067] 13920 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Instantiation of [simple type, class br.com.teste.teste.dto.Teste] value failed for JSON property idade due to missing (therefore NULL) value for creator parameter idade which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class br.com.teste.teste.dto.Teste] value failed for JSON property idade due to missing (therefore NULL) value for creator parameter idade which is a non-nullable type<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 4, column: 5] (through reference chain: br.com.teste.teste.dto.Teste["idade"])]