gpt4 book ai didi

Java:从InvocationContext获取拦截器的注解参数

转载 作者:行者123 更新时间:2023-12-02 19:05:29 26 4
gpt4 key购买 nike

我有一个使用 Quarkus 的 REST API,我想在其中编写一个拦截器,它为 API 中的每个端点获取不同的参数。基本上我想提供字符串并查看它们是否在请求附带的 JWT 中。我很难在需要时以字符串形式获取参数。

注释如下:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

import javax.enterprise.util.Nonbinding;
import javax.interceptor.InterceptorBinding;

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ScopesAllowed {

@Nonbinding
String[] value();
}

这是一个使用它的端点:

import javax.ws.rs.GET;
import java.util.List;

public class TenantResource {
@GET
@ScopesAllowed({"MyScope", "AnotherScope"})
public List<Tenant> getTenants() {
}
}

这是我对拦截器的尝试:

@Interceptor
@Priority(3000)
@ScopesAllowed({})
public class ScopesAllowedInterceptor {

@Inject
JsonWebToken jwt;

@AroundInvoke
public Object validate(InvocationContext ctx) throws Exception {

// get annotation parameters and check JWT

return ctx.proceed();
//or
throw new UnauthorizedException();
}
}

让我感到困惑的是当我尝试 System.out.println(ctx.getContextData()); 我得到:

{io.quarkus.arc.interceptorBindings=[@mypackage.annotations.ScopesAllowed(value={"MyScope", "AnotherScope"})]}

因此值在那里,但我不知道如何处理这种类型的对象。它是 Map 类型,但我不知道如何处理该对象以实际获取大括号中的值。我不想执行 toString() 然后执行一些奇怪的字符串操作来获取它们。

我试图对此进行研究,但没有找到解决方案,我现在不知道去哪里找。

最佳答案

使用 InvicationContext#getMethod() 得到Method正在调用的,然后获取该方法的注释。您可以使用 Method#getAnnotations() 获取所有注释或使用 Method.getAnnotation(Class<> annotationCls) 获取单个注释(如果存在)

Method getTenants = ctx.getMethod();
ScopesAllowed scopesAnnotation = getTenants.getAnnotation(ScopesAllowed.class);
if (scopesAnnotation != null) {
String[] scopesAllowed = scopesAnnotation.value();
}

就是这样,真的不难。 Reflection确实可以在某些情况下进行救援。这是一个很好的工具,可以随身携带。

关于Java:从InvocationContext获取拦截器的注解参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65117587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com