第44夜 JAX-RSの階層を意識したサブリソース

JAX-RSではリソースのクラスにすべてを記述するといったことは必要ない。階層に沿ってサブリソースを生成、分離が出来る。


サンプルコードを乗せたほうが早いと思うので書いてみる。昨日のエントリは足し算をするものだった。今度は引き算も追加してみよう。

今回のサンプルではアクセス可能なURLは2つ。

  • /calc/param1/param2/add ・・・足し算
  • /calc/param1/param2/sub ・・・引き算

これをサブリソースを使って作ってみる。

ルート。これで「/calc/1/2/」みたいなパスまでは実装されている。具体的な内容については記述していない。あくまでもパラメータの受け取りと次のリソースクラスへの引渡しのみ。

@Path("calc")
public class CalcResource {

    @Path("{a}/{b}")
    public CalcSubResource compute(@PathParam("a") int a, @PathParam("b") int b) {
        return new CalcSubResource(a, b);
    }
}


サブリソース。これで「/calc/1/2/」「/calc/1/2/add」「/calc/1/2/sub」という3パターン用意された。

public class CalcSubResource {
    private final int a;
    private final int b;

    public CalcSubResource(int a,int b) {
        this.a = a;
        this.b = b;
    }
    
    @GET
    @Produces("text/plain; charSet=UTF-8" )
    public String help(){
        return "パスの最後に/add または /subをつけろ。";
    }
    
    @Path("add")
    @Produces("text/plain; charSet=UTF-8" )
    @GET
    public String add() {
        return String.format("%d + %d = %d", a,b,a+b);
    }

    @Path("sub")
    @Produces("text/plain; charSet=UTF-8" )
    @GET
    public String sub() {
        return String.format("%d - %d = %d", a,b,a-b);
    }
}

こうすることで階層を意識して綺麗に書けるというのがわかるだろう。普通にnewしてわたすだけというシンプルさもすばらしい。

こういう分離を細かくやっていくとたとえば画面周りのView部分は別にわたす、ロジックや制御をこっちに、とかいう分離も可能だ。やるかやらないかはともかく自由度はあるわけだ。