java:从invocationcontext获取拦截器的注解参数

c0vxltue  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(398)

我有一个使用quarkus的RESTAPI,我想在其中编写一个拦截器,它为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<string,object>,但我不知道如何处理该对象来实际获取花括号中的值。我不想做tostring()和一些奇怪的字符串操作来获得它们。
我试图对此进行研究,但我没有找到解决办法,我也不知道现在该去哪里找。

uidvcgyl

uidvcgyl1#

使用 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();
}

就这样,真的不难。在某些情况下,反思确实能起到解救作用。这是一个很好的工具,在你的腰带下。

相关问题