11package com .dmware .api_onibusbh .infra ;
22
33import com .dmware .api_onibusbh .exceptions .*;
4+ import com .dmware .api_onibusbh .utils .ClientIpUtils ;
5+ import jakarta .servlet .http .HttpServletRequest ;
46import org .slf4j .Logger ;
57import org .slf4j .LoggerFactory ;
68import org .springframework .http .HttpStatus ;
@@ -21,66 +23,129 @@ public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
2123 private static final Logger logger = LoggerFactory .getLogger (CustomExceptionHandler .class );
2224
2325 @ ExceptionHandler (LinhasNotFoundException .class )
24- public ResponseEntity <ErrorResponse > linhasNotFoundException (LinhasNotFoundException ex ) {
25- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
26+ public ResponseEntity <ErrorResponse > linhasNotFoundException (LinhasNotFoundException ex , HttpServletRequest request ) {
27+ logger .warn ("Recurso não encontrado" ,
28+ kv ("exception" , ex .getClass ().getSimpleName ()),
29+ kv ("status" , HttpStatus .NOT_FOUND ),
30+ kv ("detail" , ex .getMessage ()),
31+ kv ("path" , request .getRequestURI ()),
32+ kv ("method" , request .getMethod ()),
33+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
2634 return ErrorResponse .of ("Não foi encontrada nenhuma linha, por favor tente novamente" , HttpStatus .NOT_FOUND );
2735 }
2836
2937 @ ExceptionHandler (CoordenadasNotFoundException .class )
30- public ResponseEntity <ErrorResponse > coordenadasNotFoundException (CoordenadasNotFoundException ex ) {
31- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
38+ public ResponseEntity <ErrorResponse > coordenadasNotFoundException (CoordenadasNotFoundException ex , HttpServletRequest request ) {
39+ logger .warn ("Recurso não encontrado" ,
40+ kv ("exception" , ex .getClass ().getSimpleName ()),
41+ kv ("status" , HttpStatus .NOT_FOUND ),
42+ kv ("detail" , ex .getMessage ()),
43+ kv ("path" , request .getRequestURI ()),
44+ kv ("method" , request .getMethod ()),
45+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
3246 return ErrorResponse .of ("Não foi encontrada nenhuma coordenada, por favor tente novamente" ,
3347 HttpStatus .NOT_FOUND );
3448 }
3549
3650 @ ExceptionHandler (DicionarioNotFoundException .class )
37- public ResponseEntity <ErrorResponse > dicionarioNotFoundException (DicionarioNotFoundException ex ) {
38- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
51+ public ResponseEntity <ErrorResponse > dicionarioNotFoundException (DicionarioNotFoundException ex , HttpServletRequest request ) {
52+ logger .warn ("Recurso não encontrado" ,
53+ kv ("exception" , ex .getClass ().getSimpleName ()),
54+ kv ("status" , HttpStatus .NOT_FOUND ),
55+ kv ("detail" , ex .getMessage ()),
56+ kv ("path" , request .getRequestURI ()),
57+ kv ("method" , request .getMethod ()),
58+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
3959 return ErrorResponse .of ("Não foi encontrado o dicionário para os dados, por favor tente novamente" ,
4060 HttpStatus .NOT_FOUND );
4161 }
4262
4363 @ ExceptionHandler (LinhaNotFoundException .class )
44- public ResponseEntity <ErrorResponse > linhaNotFoundException (LinhaNotFoundException ex ) {
45- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
64+ public ResponseEntity <ErrorResponse > linhaNotFoundException (LinhaNotFoundException ex , HttpServletRequest request ) {
65+ logger .warn ("Recurso não encontrado" ,
66+ kv ("exception" , ex .getClass ().getSimpleName ()),
67+ kv ("status" , HttpStatus .NOT_FOUND ),
68+ kv ("detail" , ex .getMessage ()),
69+ kv ("path" , request .getRequestURI ()),
70+ kv ("method" , request .getMethod ()),
71+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
4672 return ErrorResponse .of ("Não foi encontrada nenhuma linha, por favor tente novamente" , HttpStatus .NOT_FOUND );
4773 }
4874
4975 @ ExceptionHandler (ValidJsonException .class )
50- public ResponseEntity <ErrorResponse > validJsonException (ValidJsonException ex ) {
51- logger .warn ("Erro de validação JSON" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .BAD_REQUEST ), kv ("mensagem_erro" , ex .getMessage ()));
76+ public ResponseEntity <ErrorResponse > validJsonException (ValidJsonException ex , HttpServletRequest request ) {
77+ logger .warn ("Erro de validação JSON" ,
78+ kv ("exception" , ex .getClass ().getSimpleName ()),
79+ kv ("status" , HttpStatus .BAD_REQUEST ),
80+ kv ("detail" , ex .getMessage ()),
81+ kv ("path" , request .getRequestURI ()),
82+ kv ("method" , request .getMethod ()),
83+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
5284 return ErrorResponse .of (ex .getMessage (), HttpStatus .BAD_REQUEST );
5385 }
5486
5587 @ ExceptionHandler (RuntimeException .class )
56- public ResponseEntity <ErrorResponse > runtimeException (RuntimeException ex ) {
57- logger .error ("Erro interno não tratado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .INTERNAL_SERVER_ERROR ), ex );
88+ public ResponseEntity <ErrorResponse > runtimeException (RuntimeException ex , HttpServletRequest request ) {
89+ logger .error ("Erro interno não tratado" ,
90+ kv ("exception" , ex .getClass ().getSimpleName ()),
91+ kv ("status" , HttpStatus .INTERNAL_SERVER_ERROR ),
92+ kv ("detail" , ex .getMessage ()),
93+ kv ("path" , request .getRequestURI ()),
94+ kv ("method" , request .getMethod ()),
95+ kv ("client_ip" , ClientIpUtils .getClientIp (request )),
96+ ex );
5897 return ErrorResponse .of ("Ocorreu um erro interno, por favor tente novamente" , HttpStatus .INTERNAL_SERVER_ERROR );
5998 }
6099
61100 @ ExceptionHandler (IOException .class )
62- public ResponseEntity <ErrorResponse > ioException (IOException ex ) {
63- logger .error ("Erro interno não tratado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .INTERNAL_SERVER_ERROR ), ex );
101+ public ResponseEntity <ErrorResponse > ioException (IOException ex , HttpServletRequest request ) {
102+ logger .error ("Erro interno não tratado" ,
103+ kv ("exception" , ex .getClass ().getSimpleName ()),
104+ kv ("status" , HttpStatus .INTERNAL_SERVER_ERROR ),
105+ kv ("detail" , ex .getMessage ()),
106+ kv ("path" , request .getRequestURI ()),
107+ kv ("method" , request .getMethod ()),
108+ kv ("client_ip" , ClientIpUtils .getClientIp (request )),
109+ ex );
64110 return ErrorResponse .of ("Ocorreu um erro interno, por favor tente novamente" , HttpStatus .INTERNAL_SERVER_ERROR );
65111 }
66112
67113 @ ExceptionHandler (NoResourceFoundException .class )
68- public ResponseEntity <ErrorResponse > noResourceFoundException (NoResourceFoundException ex ) {
69- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
114+ public ResponseEntity <ErrorResponse > noResourceFoundException (NoResourceFoundException ex , HttpServletRequest request ) {
115+ logger .warn ("Recurso não encontrado" ,
116+ kv ("exception" , ex .getClass ().getSimpleName ()),
117+ kv ("status" , HttpStatus .NOT_FOUND ),
118+ kv ("detail" , ex .getMessage ()),
119+ kv ("path" , request .getRequestURI ()),
120+ kv ("method" , request .getMethod ()),
121+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
70122 return ErrorResponse .of ("Verifique a rota digitada ou os dados enviados" , HttpStatus .NOT_FOUND );
71123 }
72124
73125 @ ExceptionHandler (NoHandlerFoundException .class )
74- public ResponseEntity <ErrorResponse > noHandlerFoundException (NoHandlerFoundException ex ) {
75- logger .warn ("Recurso não encontrado" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .NOT_FOUND ));
126+ public ResponseEntity <ErrorResponse > noHandlerFoundException (NoHandlerFoundException ex , HttpServletRequest request ) {
127+ logger .warn ("Recurso não encontrado" ,
128+ kv ("exception" , ex .getClass ().getSimpleName ()),
129+ kv ("status" , HttpStatus .NOT_FOUND ),
130+ kv ("detail" , ex .getMessage ()),
131+ kv ("path" , request .getRequestURI ()),
132+ kv ("method" , request .getMethod ()),
133+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
76134 return ErrorResponse .of ("Verifique a rota digitada ou os dados enviados" , HttpStatus .NOT_FOUND );
77135 }
78136
79137 @ ExceptionHandler (RateLimitExceededException .class )
80- public ResponseEntity <ErrorResponse > rateLimitExceededException (RateLimitExceededException ex ) {
81- logger .warn ("Rate limit excedido" , kv ("exception" , ex .getClass ().getSimpleName ()), kv ("status" , HttpStatus .TOO_MANY_REQUESTS ), kv ("retry_after" , ex .getRetryAfterSeconds ()));
138+ public ResponseEntity <ErrorResponse > rateLimitExceededException (RateLimitExceededException ex , HttpServletRequest request ) {
139+ logger .warn ("Rate limit excedido" ,
140+ kv ("exception" , ex .getClass ().getSimpleName ()),
141+ kv ("status" , HttpStatus .TOO_MANY_REQUESTS ),
142+ kv ("retry_after" , ex .getRetryAfterSeconds ()),
143+ kv ("path" , request .getRequestURI ()),
144+ kv ("method" , request .getMethod ()),
145+ kv ("client_ip" , ClientIpUtils .getClientIp (request )));
82146 return ResponseEntity .status (HttpStatus .TOO_MANY_REQUESTS )
83147 .header ("X-Rate-Limit-Retry-After-Seconds" , String .valueOf (ex .getRetryAfterSeconds ()))
84148 .body (new ErrorResponse (java .time .LocalDateTime .now (), ex .getMessage (), HttpStatus .TOO_MANY_REQUESTS ));
85149 }
150+
86151}
0 commit comments