gpt4 book ai didi

java - Jersey 注释的注释处理器

转载 作者:行者123 更新时间:2023-11-30 08:02:27 25 4
gpt4 key购买 nike

我只是想知道 Jersey 注释的注释处理器,例如 @Path@Consumes 等。我的意思是,它是由 Jersey API 还是由 javax.ws.rs-api-xxx.jar 提供的?

我似乎无法弄清楚这些 REST 注释是如何处理的,我能否通过探索代码找到答案。

单击 @Path 获取它的定义,但我需要知道处理此注释的逻辑。

我正在使用 Eclipse,但未启用项目特定注释。

当部署在 tomcat 中时,我的其余资源工作得很好,这意味着注释正在由某个处理器处理。

最佳答案

注解很容易处理,不需要任何特殊的处理器。例如对于 @Path,你可以简单地做一些类似的事情

@Path("orders")
public class OrdersResource {}

Path annotationInstance = OrdersResource.class.getAnnotation(Path.class);
String pathValue = annotationInstance.value();

主要的事情是,通常你从做一些Reflection得到注释的实例。 .然后只需调用注释上的方法来获取要处理的任何值,或者只检查 marker annotations做一些处理。

当 Jersey 处理资源类时,它会使用注释构建一个内部模型。在伪代码中,它可能看起来像

@Path("orders")
public class OrdersResource {
@GET
@Produces("text/plain")
public String get() {}
}

Path anno = OrdersResource.class.getAnnotation(Path.class);
String path = anno.value();
Resource resource = new Resource(path);

Method[] methods = OrdersResource.class.getDeclaredMethods();
for (Method method: methods) {
Annotation[] methodAnnos = method.getAnnotations();
if (arrayContains(methodAnnos, (@GET, @POST, @PUT, etc)) {
String httpMethod = getMethod(methodAnnos);
ResourceMethod resourceMethod = new ResourceMethod(httpMethod);
Produces producesAnno = method.getAnnotation(Produces.class);
if (produces != null) {
resourceMethod.setProduces(producesAnno.value());
}
resource.addResourceMethod(resourceMethod);
}
}

有了这个资源模型, Jersey 用它来处理请求。

以上都是伪代码。反射代码是真实的,但是 ResourceResourceMethod 的 API 是虚构的。但是 Jersey 确实有那些用于对资源建模的类。例如你可以做

Resource resource = Resource.from(OrdersResource.class);

就这样,我们有了模型。有了模型我们可以做

String path = resource.getPath();
ResourceMethod method = resource.getResourceMethods();

另请参阅: Introspecting Jersey resource model Jersey 2.x有关如何内省(introspection)模型的更多解释。

就当您说 Resource resource = Resource.from(OrdersResource.class) 时,注释是如何处理的。我认为那是内部私有(private)的东西。不知道有没有暴露但它几乎肯定会使用反射。唯一的其他方法是反省字节码。我不认为它是如何完成的(尽管不要引用我的话)。

关于java - Jersey 注释的注释处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36932267/

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