JSR-311 vs Cubbyのパスの仕様

JSR-311の仕様を久々に見たらパスに正規表現を扱えるようになっていて、Cubbyと似た仕様になっていました。

@PATH("/{value,[0-9]+[.]?[0-9]*}/data")

heavy monologueより
http://heavyfeather.blog38.fc2.com/blog-entry-1020.html

上記のエントリーでは「,」でパスの変数名と正規表現を区切るように書かれていますが、仕様的には以下のように「:」で区切るようです。

@Path("widgets/{path:.+}")  
  public class Widget {
} 

JSR-000311 JAX-RS: The JavaTM API for RESTful Web Services (Proposed Final Draft)
http://jcp.org/aboutJava/communityprocess/pfd/jsr311/index.html

以前のJSR-311のパス仕様には不満だったので、この仕様追加はいいなと思います。ただこれだけでは若干自由にURLを実現するのには足りなくて、パス同士の優先順位が設定できたほうがいいんじゃないかと思います。例えばCubbyだと以下のように2つ以上のパスがマッチする設定を書いた場合に優先度を指定できますが、JSR-311の仕様だとどちらのパスが優先されるかは不定になってしまうと思います。

@Path("/api/{resourcePath}", priorty=0)

@Path("/{account}/{id}", priorty=Integer.MAX_VALUE) // priorty=Integer.MAX_VALUEは省略可

JSR-311にあってCubbyない機能としては、@Produces、@Consumesアノテーションを使った処理メソッドの切り替えです。リクエストのContent-Type、Acceptヘッダの内容でマッチするメソッドが決定されます。

@GET
@Produces("text/html")
public String getAsHtml() { ... } 

@GET
@Produces("text/plain")
public String getAsText() { ... } 

POST/GETなどのリクエストメソッドによる処理の切り替えはJSR-311、Cubbyもどちらもサポートしています。