レンタルサーバ上で稼働させる(予定)のアプリで、Wicket の REST API を使いたくなりましたので、使用した結果、使用方法について、記載します。
前提
この記事は、Wicket Version6 を使用していた際に作成した記事です。
Version7 については、Wicket Version7.3.0でRestAPIを使う | Monotalk をご確認ください。
また、2018/08/29
での Wicket の 最新版は Wicket 8.x になります。
Wicket 7.3.0 で 一部 API が削除され、更にその他の変更が入っている可能性があります。
この記事を一読した後は、core/wicketstuff-restannotations-parent at master · wicketstuff/core の example も確認することをお勧めします。
目次
- 0. 参考
- 1. pomに以下の記述を追加する
- 2. GsonRestResourceの継承クラスを作成する
- 3. WebApplicationの継承クラス内でresouceをマウントする
- 4. Javascriptでの呼び出し記述
- 5. APIの戻りのJSON
0. 参考サイト
-
Working with REST in Wicket - DZone Integration
上記のサイトをぱっと見た限り、Wicket REST annotations
をインストールすれば、Wicket 上で Restful な API が使用できるようになると思われます。
記事のリンクが辿れないですが、おそらくソースリポジトリはcore/wicketstuff-restannotations-parent at master かと思われます。 -
java - Use Wicket as a REST API - Stack Overflow
Stack Overflow の記事です。記載されているのは、通常の Wicket Page で Json 形式 の レスポンス を返す実装になります。記事中に、core/wicketstuff-restannotations-parent at master のリンクも記載されています。
1. pomに以下の記述を追加する
wicketstuff-restannotations
、wicketstuff-restannotations-json
を追加します。
<dependency>
<groupId>org.wicketstuff</groupId>
<artifactId>wicketstuff-restannotations</artifactId>
<version>6.10.0</version>
</dependency>
<dependency>
<groupId>org.wicketstuff</groupId>
<artifactId>wicketstuff-restannotations-json</artifactId>
<version>6.10.0</version>
</dependency>
2. GsonRestResourceの継承クラスを作成する
-
FestivalApis.java
Rest サービス API です。 public メソッドに対して、MethodMapping
アノテーションで URL を設定しています。
package xyz.monotalk.web.apis; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.wicketstuff.rest.annotations.MethodMapping; import org.wicketstuff.rest.resource.gson.GsonRestResource; import xyz.monotalk.models.entity.Festival; public class FestivalApis extends GsonRestResource { private static final long serialVersionUID = -7863247209549049518L; @MethodMapping("/festivals") @SuppressWarnings("unchecked") public List<Festival> getAllfestivals() { EntityManagerFactory emf = Persistence.createEntityManagerFactory("POfDM_Local"); EntityManager em = null; List<Festival> festivals = null; try { em = emf.createEntityManager(); festivals = (List<Festival>) em.createNamedQuery("findAllFestivals").getResultList(); } finally { if (em != null) { em.close(); } } return festivals; } }
-
補足
MethodMappingアノテーションでurlとmethodを紐付けします。 -
Festival.java
API で使用する Entity クラスです。
NetBeans でDatabase のテーブル定義を元に自動生成した Entity クラス を使用しています。
package xyz.monotalk.models.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table(name = "festival") @NamedQuery(name = "findAllFestivals", query = "SELECT f FROM Festival f") public class Festival { @Id @Column(name = "id") private int id; @Column(name = "name") private String name; @Column(name = "site_url") private String site_url; @Column(name = "description") private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSite_url() { return site_url; } public void setSite_url(String site_url) { this.site_url = site_url; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Festival [id=").append(id).append(", name=").append(name).append(", site_url=") .append(site_url).append(", description=").append(description).append("]"); return builder.toString(); } }
3. WebApplicationの継承クラス内でresouceをマウントする
- WicketApplication.java
package xyz.monotalk.web; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.request.resource.IResource; import org.apache.wicket.request.resource.ResourceReference; import xyz.monotalk.web.apis.FestivalApis; /** * Application object for your web application. If you want to run this * application without deploying, run the Start class. * * @see xyz.monotalk.Start#main(String[]) */ public class WicketApplication extends WebApplication { /** * @see org.apache.wicket.Application#getHomePage() */ @Override public Class<? extends WebPage> getHomePage() { return xyz.monotalk.web.pages.top.TopPage.class; } /** * @see org.apache.wicket.Application#init() */ @Override public void init() { super.init(); // pageMount mountPage("/top", xyz.monotalk.web.pages.top.TopPage.class); // mountApis mountResource("/manager", new ResourceReference("restReference") { private FestivalApis apis = new FestivalApis(); private static final long serialVersionUID = 7118595340535924652L; @Override public IResource getResource() { return apis; } }); } }
- 補足
以下の実装で、 URL/manager
配下 に FestibalApis の サービス URL をマウント していることになります。
クラスがmountResource("/manager", new ResourceReference("restReference") {...
/manager
に、Method が/festivals
に マウントされているため、/manager/festivals
で、メソッド呼び出しができるようになります。
4. JavaScriptでの呼び出し記述
Web API をデプロイ後に、仮に JavaScript で JQuery を使って呼び出したと仮定すると、以下の実装になります。
$.ajax({
type : "GET",
url : "./manager/festivals",
data : {},
dataType : 'json'
}).success(function(data) {
self.bindListData(data);
}).error(function(data) {
alert("error");
console.log(data);
});
5. APIの戻りのJSON
以下のような戻り値が取得できます。
[{"id":1,"name":"Rainbow Disco Club","site_url":"http://www.rainbowdiscoclub.com/tokyo/","description":"Rainbow Disco Club"},
{"id":2,"name":"TAICOCLUB","site_url":"http://taicoclub.com/15/","description":"TAICOCLUB"}]
core/wicketstuff-restannotations-parent at master は、Java オブジェクト、Json への変換を 透過的に実施してくれます。
ライブラリ内で変換を実施しているのは、GsonSerialDeserial.java で、実装を確認すると内部的に
gson
を使用しているのがわかります。 通常の Java オブジェクトであれば、意識する必要はないですが、仮に変換できない場合、Java オブジェクトの Json の変換方法は、以下が参考になるかと思います。
以上です。
コメント