レンタルサーバ上で稼働させる(予定)のアプリで、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に以下の記述を追加する

wicketstuff-restannotationswicketstuff-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"}]
Entity クラスの field 値がキーで、 value が設定値の形式で json が作成されます。
core/wicketstuff-restannotations-parent at master は、Java オブジェクト、Json への変換を 透過的に実施してくれます。
ライブラリ内で変換を実施しているのは、GsonSerialDeserial.java で、実装を確認すると内部的に gson使用しているのがわかります。
通常の Java オブジェクトであれば、意識する必要はないですが、仮に変換できない場合、Java オブジェクトの Json の変換方法は、以下が参考になるかと思います。

以上です。

コメント