第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)
  {
    ...
  }
  ...
}