Preciso registrar informações de rastreamento usando um Tracer
bean, com escopo de solicitação, tanto no meu método REST quanto no manipulador de exceções. O Tracer
bean é consumido no método REST para registrar as informações de rastreamento no início do processamento da solicitação e desejo usar a mesma mensagem de rastreamento no manipulador de exceção quando ocorrer uma exceção.
No entanto, estou enfrentando dificuldades para acessar o Tracer
bean com escopo de solicitação em meu manipulador de exceções. Eu tentei @ExceptionHhandler
a anotação do controlador REST no controlador REST e @ControllerAdvice
, mas nenhuma delas oferece suporte ao acesso a um bean de escopo.
Aqui está minha configuração:
@RestController
public class MyController {
@Bean
@RequestScope
Tracer tracer(){
return new Tracer();
}
@GetMapping(path = "list")
public String list(Tracer trace){
return trace.getCorrelationId();
}
@GetMapping(path = "throw")
public String throwEx(Tracer trace,HttpServletRequest req){
throw new RuntimeException("Ops");
}
@ExceptionHandler({Exception.class})
ResponseEntity<String> defaultExceptionHandler(Tracer tracer, HttpServletRequest req, Exception ex) {
return ResponseEntity
.internalServerError()
.body("ERROR: " + tracer.getCorrelationId());
}
}
O rastreador (para completar):
@Getter
public class Tracer {
private final String requestId;
private final String correlationId;
public Tracer() {
requestId = null;
correlationId = UUID.randomUUID().toString();
}
public Tracer(String requestId, String correlationId) {
this.requestId = requestId;
this.correlationId = correlationId;
}
}
Aqui o teste:
@SpringBootTest
@AutoConfigureMockMvc
class MyControllerTest {
@Autowired
protected MockMvc mockMvc;
@Test
void testExceptionHandler() throws Exception {
mockMvc
.perform(MockMvcRequestBuilders.get("/throw")
)
.andDo(MockMvcResultHandlers.print())
.andReturn()
.getResponse()
.getContentAsString();
}
}
E aqui está o problema:
Não foi possível resolver o parâmetro [0] em org.springframework.http.ResponseEntity<java.lang.String> com.baeldung.scopes.MyController.defaultExceptionHandler(com.baeldung.scopes.Tracer,jakarta.servlet.http.HttpServletRequest,java. lang.Exception): Nenhum resolvedor adequado
Parece que não consigo injetar diretamente o bean Tracer no método manipulador de exceções.
Estou faltando alguma coisa aqui? Existe outra abordagem para resolver esse problema?
Qualquer ajuda ou sugestão seria muito apreciada!
Talvez "sujo", mas pelo menos funciona:
Outra solução é ThreadLocal (spring web-mvc usa modelo thread por solicitação)
Ps: corrija o erro de compilação, se houver, já que não tenho IDE no momento
Outra abordagem. Adicione anotações
@RequestScope
e@Component
paraTracer
:Injete-o em seu controlador e remova os
trace
parâmetros do método.