9

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在路径/animals/dog返回类型Dog
  • GET在路径/animals/cat返回类型Cat

(此外,它是否让我知道 AnimalResource 是一种资源?)

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

4

1 回答 1

9

[更新 - 示例是相同的,但我已经改写了我的警告]

可以办到。尝试以下操作:

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

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;
    }
}

这些自省类在 jersey-server 中。

请注意,上面的示例使用了一些在包名称中包含“impl”的 Jersey 类,这表明这些 Jersey 类不适合公共消费,并且将来很可能会发生重大变化。我只是在这里猜测-我不是泽西岛的提交者。只是一个随机用户。

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

于 2012-11-21T00:43:09.943 回答