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

Usando questõa de Validation

Bom estou estruturando uma aplicação aonde existem campos que devem ser obrigatorio, ate ai tudo bem, oq ocorre e que, usando o validation do spring a exception que me retornar e esse:

{
    "timestamp": "2023-07-13T12:02:45.539+00:00",
    "mensagem": "Validation failed for classes [com.wmsexpert.ckbox.model.Deposito] during persist time for groups [javax.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='Campo descricao obrigatorio!', propertyPath=descricao, rootBeanClass=class com.wmsexpert.ckbox.model.Deposito, messageTemplate='Campo descricao obrigatorio!'}\n]",
    "statuscode": "BAD_REQUEST",
    "details": "uri=/api/deposito"
}

E eu queria saber de uma forma de retonar a mensagem que eu especifiquei no caso usando o validatione exceptions porem mesmo eu fazendo isso:

@ExceptionHandler(ValidationException.class)
public final ResponseEntity<ExceptionResponse> validationExceptions(ValidationException ex, WebRequest request){

    ExceptionResponse exceptionResponse = new ExceptionResponse(
            new Date(),
            ex.getMessage(),
            HttpStatus.BAD_REQUEST,
            request.getDescription(false)
    );
    return new ResponseEntity<>(exceptionResponse, HttpStatus.BAD_REQUEST);

}

Mesmo assim continua dando esse erro, queria saber uma forma de estruturar o hadle para que eu possa criar um retorno legivel para a aplicação sobre o erro do validation, Esse ExceptionResponse e um reponse de exception propio que eu uso.

6 respostas

Olá, Weverton!

Pelo que entendi, você está enfrentando um problema ao tentar retornar uma mensagem personalizada de erro ao lidar com exceções de validação usando o Spring Validation.

Pelo trecho de código que você compartilhou, parece que você está usando a anotação @ExceptionHandler para tratar a exceção ValidationException. No entanto, mesmo assim, você ainda está recebendo a mesma mensagem de erro.

Uma possível solução para esse problema é criar um manipulador de exceções específico para as exceções de validação do Spring. Você pode fazer isso criando um método com a anotação @ExceptionHandler para cada tipo de exceção de validação que você deseja tratar.

Aqui está um exemplo de como você pode fazer isso:

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ExceptionResponse> handleValidationException(MethodArgumentNotValidException ex, WebRequest request) {
    List<String> errors = ex.getBindingResult().getFieldErrors()
            .stream()
            .map(DefaultMessageSourceResolvable::getDefaultMessage)
            .collect(Collectors.toList());

    ExceptionResponse exceptionResponse = new ExceptionResponse(
            new Date(),
            "Erro de validação",
            HttpStatus.BAD_REQUEST,
            errors.toString()
    );

    return new ResponseEntity<>(exceptionResponse, HttpStatus.BAD_REQUEST);
}

Nesse exemplo, estamos tratando a exceção MethodArgumentNotValidException, que é lançada pelo Spring quando ocorrem erros de validação nos argumentos do método. Estamos obtendo a lista de erros de validação usando getBindingResult().getFieldErrors(), e em seguida, mapeando cada erro para a mensagem padrão usando getDefaultMessage(). Por fim, estamos retornando uma resposta personalizada contendo a lista de erros.

Lembre-se de ajustar o código de acordo com as exceções de validação que você está enfrentando.

Espero ter ajudado e bons estudos!

Bom usei esse mesmo codigo que mostro e ele me retororna o seguinte erro:

Caused by: java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]: {public org.springframework.http.ResponseEntity com.wmsexpert.ckbox.exception.handler.CustomizedResponseEntityExceptionHendler.handleValidationException(org.springframework.web.bind.MethodArgumentNotValidException,org.springframework.web.context.request.WebRequest), public final org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest) throws java.lang.Exception}
    at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.addExceptionMapping(ExceptionHandlerMethodResolver.java:114)
    at org.springframework.web.method.annotation.ExceptionHandlerMethodResolver.<init>(ExceptionHandlerMethodResolver.java:78)
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.initExceptionHandlerAdviceCache(ExceptionHandlerExceptionResolver.java:291)
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.afterPropertiesSet(ExceptionHandlerExceptionResolver.java:268)
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addDefaultHandlerExceptionResolvers(WebMvcConfigurationSupport.java:1090)
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.handlerExceptionResolver(WebMvcConfigurationSupport.java:1032)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 20 common frames omitted

Justamente esse MethodArgumentNotValidException.class sempre quebra quando eu tento usalo

Manda aqui como ficou seu código completo.

Outra coisa, você chegou a criar uma classe RestControllerAdvice ou esses exceptions handlers estão dentro de uma classe controller específica?

Aqui nesse curso tem uma aula que mostra sobre tratamento de erros em uma API Rest com Spring Boot: https://cursos.alura.com.br/course/spring-boot-aplique-boas-praticas-proteja-api-rest

Aqui esta a classe que eu estou ultilizando para fazer essas tratativas de exceptions:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Acho que o problema é por conta da herança, pois a classe sendo herdada já tem um método que trata a mesma exception.

Remova o extends ResponseEntityExceptionHandler dessa sua classe e veja se resolve.

Era isso mesmo muito obg!

Porem ainda me retorna aquela mensagem enorme e eu queria apenas retornar a mensagem que eu definir:

@NotNull(message="Campo descricao e obrigatorio!")

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software