Menu Close

第53章 アノテーションの継承

概要

JAX-RS アノテーションは、アノテーション付きインターフェースを実装するサブクラスおよびクラスによって継承できます。継承メカニズムにより、サブクラスおよび実装クラスは親から継承されたアノテーションを上書きできます。

概要

継承は、Java のより強力なメカニズムの 1 つです。開発者は、特定のニーズに合わせて特別なオブジェクトを作成できる汎用オブジェクトを作成できるためです。JAX-RS は、クラスからリソースのマッピングに使用されるアノテーションをスーパークラスから継承できるようにすることで、この強力な性質を保持します。

JAX-RS のアノテーション継承は、インターフェースのサポートも拡張されます。実装クラスは、実装するインターフェースで使用される JAX-RS アノテーションを継承します。

JAX-RS 継承ルールは、継承されたアノテーションをオーバーライドするメカニズムを提供します。しかし、スーパークラスまたはインターフェースから継承するコンストラクトから JAX-RS アノテーションを完全に削除することはできません。

継承ルール

リソースクラスは、実装するインターフェースから JAX-RS アノテーションを継承します。リソースクラスは、拡張するスーパークラスからも JAX-RS アノテーションを継承します。スーパークラスから継承されたアノテーションは、インターフェースから継承されたアノテーションよりも優先されます。

例53.1「アノテーションの継承」 のコード例では、Kaijin クラスの getMonster() メソッドは、Kaiju インターフェースから @Path@GET、および @PathParam アノテーションを継承します。

例53.1 アノテーションの継承

public interface Kaiju
{
  @GET
  @Path("/{id}")
  public Monster getMonster(@PathParam("id") int id);
  ...
}

@Path("/kaijin")
public class Kaijin implements Kaiju
{
  public Monster getMonster(int id)
  {
    ...
  }
  ...
}

継承されたアノテーションの上書き

継承されたアノテーションのオーバーライドは、新しいアノテーションを提供するのと同じくらい簡単です。サブクラスまたは実装クラスがメソッドに独自の JAX-RS アノテーションを提供する場合、そのメソッドのすべての JAX-RS アノテーションは無視されます。

例53.2「アノテーションの継承の上書き」 のコード例では、Kaijin クラスの getMonster() メソッドは Kaiju インターフェースからのアノテーションを継承しません。実装クラスは @Produces アノテーションをオーバーライドします。これにより、インターフェースからのすべてのアノテーションが無視されます。

例53.2 アノテーションの継承の上書き

public interface Kaiju
{
  @GET
  @Path("/{id}")
  @Produces("text/xml");
  public Monster getMonster(@PathParam("id") int id);
  ...
}

@Path("/kaijin")
public class Kaijin implements Kaiju
{

  @GET
  @Path("/{id}")
  @Produces("application/octect-stream");
  public Monster getMonster(@PathParam("id") int id)
  {
    ...
  }
  ...
}