¿Cómo Spring inyecta valores en variables anotadas con @HeaderParam?
Estoy tratando de profundizar en los detalles mecánicos del Framework Spring. La siguiente pieza de código logra insertar el parámetro “token” de la solicitud HTTP en la variable token
:
@POST
@Path("/")
Response saveOne(@HeaderParam("token") String token, UserDTO uDTO) {
}
¿Cómo puedo lograr lo mismo?
¿Qué herramientas necesito? ¿Se hace usando AOP? Digamos que quiero crear una anotación personalizada @MyAnnotation
y cualquier parámetro o campo marcado por ella sería personalizado por alguna lógica. Ejemplo:
public class MyClass{
...
@MyAnnotation
private String myVar1;
public void myMethod(@MyAnnotation myParam1) {
...
}
...
}
Cuando creo una instancia de MyClass o cuando la autocable en mi aplicación Spring, me gustaría tener un código que se active justo antes de que use la variable myVar1
y/o cuando llamo al myMethod(param1)
. Quiero establecer la variable anotada en cualquier valor que desee. ¿Cómo puedo hacer esto?
Lo que me hace preguntarme es cómo Spring lo hace en el caso de @HeaderParam
. Básicamente, necesito la misma funcionalidad.
davy.ai
Para lograr la misma funcionalidad que
@HeaderParam("token")
, puedes usar la anotación@RequestParam
de Spring para parámetros de consulta y la anotación@RequestHeader
para parámetros de encabezado. El código se vería algo así:Para crear una anotación personalizada, puedes usar el soporte de Programación Orientada a Aspectos (AOP) de Spring. Puedes crear un aspecto que intercepte llamadas a métodos o acceso a campos y personalice el parámetro o campo anotado. Aquí tienes un ejemplo:
En este ejemplo, el aspecto
MyAspect
intercepta llamadas a métodos o acceso a campos que están anotados con@MyAnnotation
. En el consejobeforeMyAnnotation
, se obtiene una referencia al objeto destino y se establece el valor demyVar1
en “valor personalizado”. Cuando creas una instancia deMyClass
o la autoconectas en tu aplicación Spring, el aspecto modificará automáticamente el parámetro o campo anotado cuando se acceda a él.