Java 在我的应用程序中查找所有Jersey资源方法的列表?

Java 在我的应用程序中查找所有Jersey资源方法的列表?,java,rest,reflection,jersey,jax-rs,Java,Rest,Reflection,Jersey,Jax Rs,Jersey是否提供了列出其公开的所有资源的方法?也就是说,给定资源类: package com.zoo.resource @Path("/animals") public class AnimalResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("dog") public Dog getDog(){ ... } @GET @Produces(MediaTy

Jersey是否提供了列出其公开的所有资源的方法?也就是说,给定资源类:

package com.zoo.resource

@Path("/animals")
public class AnimalResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("dog")
    public Dog getDog(){
    ...
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("cat")
    public Cat getCat(){
    ...
    }
}
泽西岛是否为我提供了获取信息的途径:

  • GET
    在路径
    /animates/dog
    返回type
    dog
  • GET
    在路径
    /animates/cat
    返回type
    cat
(此外,它是否为我提供了一种途径,让我知道动物资源是一种资源?)

我希望在单元测试中可以获得这些信息,以便检查我公开的每个资源是否符合外部系统的期望。
我知道automagic公开了,但我没有看到它显示返回类型,我也不知道如何从测试中访问它。

[更新-示例相同,但我重新编写了我的注意事项]

这是可以做到的。请尝试以下操作:

import com.sun.jersey.api.model.AbstractResource;
import com.sun.jersey.api.model.AbstractSubResourceMethod;
import com.sun.jersey.server.impl.modelapi.annotation.IntrospectionModeller;

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

public class AnimalsTest
{
   public static void main(String [] args)
   {
      AbstractResource resource = IntrospectionModeller.createResource(AnimalResource.class);
      System.out.println("Path is " + resource.getPath().getValue());

      String uriPrefix = resource.getPath().getValue();
      for (AbstractSubResourceMethod srm :resource.getSubResourceMethods())
      {
         String uri = uriPrefix + "/" + srm.getPath().getValue();
         System.out.println(srm.getHttpMethod() + " at the path " + uri + " return " + srm.getReturnType().getName());
      }
   }
}

这些内省类位于jersey服务器中

请注意,上面的示例使用了一些在包名中带有“impl”的Jersey类,这表明这些Jersey类不是用于公共消费的,将来很可能会有突破性的更改。我只是在猜测——我不是一个球衣投递者。只是一个随机用户


我也通过仔细阅读源代码了解了上面的所有内容。我从未见过任何关于内省JAX-RS注释类的批准方法的文档。我同意官方支持的API做这类事情会非常有帮助。

我的动物园资源只是一个简单的例子,如果这就是你所说的“很明显,感兴趣的类别不是供公众消费的。”如果你对这方面的需求提出质疑,我正在用另一个应用程序发送和接收JSON对象,我们正在尝试强制执行我们对数据模型的一致意见。他们告诉我在/anies/cat上他们需要一些json格式,我确认它与资源返回的POJO匹配,路径相同。那么有没有办法发现我所有的资源类,或者我必须维护它们的列表?不,不,不,我不是在挑你的动物园。我试图警告使用内部实现类的危险。很抱歉给你带来了困惑。希望我的更新答案能澄清这一点。关于资源发现-由于Jersey在服务器中发现所有带注释的类,所以它肯定是可以做到的,并且在源代码中的某个地方。我还没有深入研究它,因为在我的项目中,我已经维护了一个感兴趣的类的列表,并且并不真正需要这个功能。现在它不再是一个公共类了,你知道如何在没有内省模型的情况下做到这一点吗?
class Dog {}
class Cat {}
@Path("/animals")
class AnimalResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("dog")
    public Dog getDog(){
      return null;
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("cat")
    public Cat getCat(){
       return null;
    }
}