gpt4 book ai didi

java - 在 ContainerRequestFilter 中获取资源类注释值

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:48 24 4
gpt4 key购买 nike

我有点难以理解其余拦截器注释如何添加不同的值,这些值稍后会在过滤器中可见。鉴于下面的代码,我希望一旦进入过滤器,权限值就会包含 foo 和 bar,但它们是空的。任何帮助将不胜感激。

注释

package edu.psu.swe.fortress.poc.interceptor;

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

import javax.enterprise.util.Nonbinding;
import javax.ws.rs.NameBinding;

@NameBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
public @interface FortressProtected
{
@Nonbinding String[] permissions() default {};
}

过滤器

package edu.psu.swe.fortress.poc.interceptor;

import java.io.IOException;
import java.lang.annotation.Annotation;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Provider
@FortressProtected
public class FortressAuthorizer implements ContainerRequestFilter
{

@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
System.out.println("In the interceptor");
Class<?> clazz = this.getClass();
FortressProtected annotation = clazz.getAnnotation(edu.psu.swe.fortress.poc.interceptor.FortressProtected.class);

System.out.println("Annotation? " + clazz.isAnnotation());

for (Annotation a : clazz.getAnnotations())
{
System.out.println(a);
}

for (String s : annotation.permissions())
{
System.out.println(s);
}
}
}

应用配置

package edu.psu.swe.fortress.poc.rest;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import edu.psu.swe.fortress.poc.interceptor.FortressAuthorizer;
import edu.psu.swe.fortress.poc.interceptor.FortressProtected;

@ApplicationPath("")
public class FortressTestApp extends Application
{
private Set<Class<?>> clazzez_ = new HashSet<>();
{
clazzez_.add(ResourceImpl.class);
clazzez_.add(FortressProtected.class);
clazzez_.add(FortressAuthorizer.class);
}
public Set<Class<?>> getClasses()
{
return clazzez_;
}
}

资源类

package edu.psu.swe.fortress.poc.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import edu.psu.swe.fortress.poc.interceptor.FortressProtected;

@FortressProtected(permissions={"foo", "bar"})
@Path("tests")
public class ResourceImpl
{
@GET
@Produces("application/text")
public String getHello()
{
FortressProtected annotation = this.getClass().getAnnotation(edu.psu.swe.fortress.poc.interceptor.FortressProtected.class);

System.out.println(annotation.toString());

return "hello";
}
}

日志输出如下:

15:59:55,223 INFO [stdout] (default task-9) @edu.psu.swe.fortress.poc.interceptor.FortressProtected(permissions=[]) 15:59:55,229 INFO [stdout] (default task-9) @edu.psu.swe.fortress.poc.interceptor.FortressProtected(permissions=[foo, bar])

提前致谢。

最佳答案

在你的过滤器中查看这个

Class<?> clazz = this.getClass();
FortressProtected annotation = clazz.getAnnotation(FortressProtected.class);

this.getClass() 对应于过滤器类(其注解没有值)。相反,您需要在 ResourceImpl

上获取注解

几个选项。您可以显式使用 ResourceImpl.class.getAnnotation(...)。但是这样做的问题是,一旦你绑定(bind)了多个类,你怎么匹配哪个类对应哪个请求。因此,下一个选项更可行。

你所做的是注入(inject) ResourceInfo .有了它,您可以调用它的 getResourceMethodgetResourceClass 方法。这些方法分别返回匹配的方法和类。然后,您可以在类级别和方法级别检查注释(因为我们也可以在方法级别进行绑定(bind))。所以你可能有更像的东西:

@Provider
@FortressProtected
public class FortressAuthorizer implements ContainerRequestFilter {

@Context
ResourceInfo resourceInfo;

@Override
public void filter(ContainerRequestContext requestContext) throws IOException {

Class<?> resourceClass = resourceInfo.getResourceClass();
FortressProtected classAnnot = resourceClass.getAnnotation(FortressProtected.class);
if (classAnnot != null) {
// do something with annotation
}

Method resourceMethod = resourceInfo.getResourceMethod();
FortressProtected methodAnnot = resourceMethod.getAnnotation(FortressProtected.class);
if (methodAnnot != null) {
// do something with annotation
}
}
}

关于java - 在 ContainerRequestFilter 中获取资源类注释值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198555/

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