JBoss Erraiは、GWTをベースに次のような機能を追加した、RIA開発向けのフレームワークです。最近2.0がリリースされました。
- 独自の非同期メッセージング(Errai bus)
- RPC(not GWT-RPC)
- JAX-RS対応
- Beanのマーシャリング
- クライアントでのDIとCDI(JSR-299/JSR-330)のサポート(一部)
- CDIベースののクライアント・サーバ間のイベント機構
GWTをベースにしていますが、GWTの一部やGINを置き換えとなる多くの機能があります。
個人的に気になっているのはJAX-RS対応で、クライアントから直接サーバのJAX-RSのインタフェースを呼び出すことができます。また、Beanのマーシャリング機能を備えるため、GWT-RPCと同様にクライアント・サーバで同一のモデルを使用することができます。
GWTののRequestFactoryやAutoBeanではモデルに対してもインタフェースを定義する必要があり煩雑なので、GWT-RPCの大体として有望ではないでしょうか。ただ、同一のモデルを使用するため、GWTをの制約はかかってきますが。
また、JAX-RSのサービスを利用する場合、RequestBuilderとJavaScriptObjectを使用する必要がありましたが、Erraiを使うとサーバのJAX-RSインタフェースがそのまま使えるのでかなり楽になりそうです。
ErraiはManve archetypeがあるので(Errai Quickstart guide)、サンプルとしてJAX-RSを使ったプロジェクトを作ってみました。
mvn archetype:generate \ -DarchetypeGroupId=org.jboss.errai.archetypes \ -DarchetypeArtifactId=jaxrs-quickstart \ -DarchetypeVersion=2.0.0.Final \ -DarchetypeRepository=https://repository.jboss.org/nexus/content/groups/public/
JAX-RSのサービスインタフェースとして以下のようなクラスが作成されます。
@Path("customers") public interface CustomerService { @GET @Produces("application/json") public ListlistAllCustomers(); @POST @Consumes("application/json") @Produces("text/plain") public long createCustomer(Customer customer); @PUT @Path("/{id}") @Consumes("application/json") @Produces("application/json") public Customer updateCustomer(@PathParam("id") long id, Customer customer); @DELETE @Path("/{id}") public void deleteCustomer(@PathParam("id") long id); @GET @Path("/{id}") @Produces("application/json") public Customer retrieveCustomerById(@PathParam("id") long id); }
JAX-RSのアノテーションのみでErraiのためのコードはありません。実装クラスの方は省略します。
JAX-RSでやり取りされるモデルクラスは以下のようになります。
@Portable @Entity public class Customer implements Serializable, Comparable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue private long id; @NotNull @Size(min = 1) private String firstName; @NotNull @Size(min = 1) private String lastName; @NotNull @Size(min = 1) private String postalCode; private Date lastChanged; public Customer() { } // setter/getter ... }
@Portableというアノテーションがあるクラスがマーシャリングの対象になります。アノテーションを付けられないようなケースやマーシャリング方法を変更したい場合の対応方法も用意されています。
実際にJAX-RSにアクセスするクライアントのコードは以下のようになります。
@EntryPoint public class App { @Inject private CallercustomerService; // …. final RemoteCallback creationCallback = new RemoteCallback () { @Override public void callback(Long id) { // レスポンスの処理 // ... } }; @PostConstruct public void init() { final Button create = new Button("Create", new ClickHandler() { @Override public void onClick(ClickEvent clickEvent) { Customer customer = new Customer(custFirstName.getText(), custLastName.getText(), custPostalCode.getText()); customerService.call(creationCallback).createCustomer(customer); } }); // ….. } }
サービスの呼び出しは非同期処理のためCallerというProxyを経由します。Proxyのcallメソッドに、レスポンスを処理するRemoteCallbackを渡します(サービスの戻り値が渡されます)。customerServiceは@Injectアノテーションがついているので、DI対象になります。
GWTのEntryPointは@EntryPointアノテーションで指定します。initメソッドには@PostConstructアノテーションが付いているので、インスタンスが生成されDIが行われた後に呼び出されます。ここでUIの初期化も行います。
ちょっと見た感じかなりよさそうなErraiですが、以下は2.0では提供されていないようです。MVPについてはGWTの標準もしくは、GWTPと組み合わせることになりそうです。どちらもGINを使用しているので、次はDIにErraiを使うように変更できるか試してみたいと思います。
- MVPパターンのサポート
- Widget類
0 件のコメント:
コメントを投稿