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 に答える