es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Interceptar encabezado y llamar al servicio antes de cada punto final.

Tengo un caso de uso donde cada solicitud HTTP a mi aplicación SpringBoot contendrá un id en una cabecera. Necesito llamar a un servicio interno para obtener información almacenada en mi base de datos basada en ese id; luego, esa información se utilizará dentro de mis servicios llamados por los RestControllers.

He pensado en usar Interceptors, pero aunque estos me permitirán llamar a mi servicio y obtener información en la DB, no conozco ninguna forma de enviar ese objeto a mis servicios comerciales.
Otro enfoque que he explorado es a través de AOP. Pero aunque puedas obtener información del método que te llama dentro de tus aspectos, no creo que puedas acceder a los datos recuperados por el aspecto dentro del método anotado.

¿Hay alguna forma de hacer esto correctamente sin usar @RequestHeader y llamar a mi servicio manualmente en cada método RestController (duplicando así una tonelada de código) ?

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en Java, Spring, Header, AOP e Interceptor, existe una solución factible para su caso de uso. Dado que ha mencionado que cada solicitud HTTP a su aplicación SpringBoot contendrá una identificación en un encabezado, puede utilizar un filtro personalizado que se ejecute antes de que la solicitud llegue al controlador. Este filtro puede extraer la identificación del encabezado y almacenarla en una variable ThreadLocal.

    ThreadLocal es una forma de almacenar datos a los que se puede acceder desde cualquier método que se esté ejecutando en el mismo hilo. Puede utilizar esto para almacenar la identificación extraída del encabezado y recuperarla más tarde al invocar el servicio interno para obtener la información necesaria de la base de datos.

    Una vez que haya recuperado la información de la base de datos, puede crear un POJO (Plain Old Java Object) y almacenar los datos recuperados en él. Luego puede almacenar este POJO en la variable ThreadLocal para que pueda ser accedido por los servicios empresariales llamados por los RestControllers.

    De esta manera, no es necesario duplicar el código en cada método de RestController, ni utilizar AOP o interceptores. Todo lo que necesita es un filtro personalizado que extraiga la identificación del encabezado y la almacene en una variable ThreadLocal, y un POJO que almacene la información recuperada de la base de datos.

    Espero que esta solución le ayude a implementar su caso de uso.

Comments are closed.