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.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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í:

    @POST
    @Path("/")
    Response saveOne(@RequestHeader("token") String token, UserDTO uDTO) {
    }
    

    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:

    @Aspect
    @Component
    public class MyAspect {
    
        @Before("@annotation(com.example.MyAnnotation)")
        public void beforeMyAnnotation(JoinPoint joinPoint) {
            Object target = joinPoint.getTarget();
            if (target instanceof MyClass) {
                MyClass myClass = (MyClass) target;
                myClass.setMyVar1("valor personalizado");
            }
        }
    
    }
    
    public class MyClass {
        ...
        @MyAnnotation
        private String myVar1;
    
        public void myMethod(@MyAnnotation String myParam1) {
        ...
        }
    
        public void setMyVar1(String value) {
            this.myVar1 = value;
        }
        ...
    }
    

    En este ejemplo, el aspecto MyAspect intercepta llamadas a métodos o acceso a campos que están anotados con @MyAnnotation. En el consejo beforeMyAnnotation, se obtiene una referencia al objeto destino y se establece el valor de myVar1 en “valor personalizado”. Cuando creas una instancia de MyClass o la autoconectas en tu aplicación Spring, el aspecto modificará automáticamente el parámetro o campo anotado cuando se acceda a él.

Comments are closed.