JSONRPCServlet改めWebServiceServlet

必要な人がいるのかまったくもって不明なのだが、今月末あたりにリリース予定のJSONIC 0.9.6では、JSONRPCServletの機能強化版としてWebServiceServletが導入されます(JSONRPCServletは廃止)。実装はもう終わっているので今回は確実に出ると思われ。

まず、設定方法はこんな感じ。

<servlet>
  <description>JSON-WebService</description>
  <servlet-name>json-ws</servlet-name>
  <servlet-class>net.arnx.jsonic.web.WebServiceServlet</servlet-class>
  <init-param>
    <param-name>config</param-name>
    <param-value>
      debug: true
      encoding: 'UTF-8'
      mappings: {
        '/[package]/[class].[ext]': 'sample.web.${package}.service.${class}Service'
        '/[class].[ext]': 'sample.service.${class}Service'
      }
    </param-value>
  </init-param>
</servlet>

"["と"]"で囲まれた部分が変数になっていて、対応するクラスの${ほげ}にマッピングされる。この時[class]の値が"rpc"だったらRPCモードになってJSON-RPCのmethodにクラス名.メソッド名を書くと対象クラスのメソッドが呼び出しできる。一方で[class]の値が"rpc"以外の時はRESTモードになり、GET/POST/PUT/DELETEでそれぞれfind/create/update/deleteメソッドが呼び出される。なお、クラス名に使われなかった変数は、引数のobjectに上書きする形で値がセットされるので、RailsみたいにURLからidを取得したいみたいな要望にも対応できる*1

前回予告した通り、Seasar2対応の機能も標準添付されるので、次のような記載をするだけでSeasar上で管理されているコンポーネントJSON-RPC or Restfullにできます。

  <init-param>
    <param-name>config</param-name>
    <param-value>
      container: 'net.arnx.jsonic.web.S2Container'
      ...
    </param-value>
  </init-param>

*1:なお、[ext]は無視されるので拡張子をxmlにしてもXML-RPCになるわけではない。また、package変数とclass変数は特別視されており、package変数は/が.に置換され、class変数はUpperCamelに自動的に変換される