IDEA+Jersey+Tomcat搭建RESTful API

部分內(nèi)容參考自:https://github.com/waylau/Jersey-2.x-User-Guide/blob/master/Chapter%204.%20Application%20Deployment%20and%20Runtime%20Environments%20%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E7%8E%AF%E5%A2%83/4.7.%20Servlet-based%20Deployment%20%E5%9F%BA%E4%BA%8E%20Servlet%20%E7%9A%84%E9%83%A8%E7%BD%B2.md
maven庫:http://mvnrepository.com/

環(huán)境:

IDEA Ultimate 2017.2.2 + JDK 1.8 + Jersey 2 + Maven + Tomcat 9.0.0.M22

首先創(chuàng)建項(xiàng)目:

選中Web Application(3.1)框架,勾選Create web.xml,IDE會在創(chuàng)建項(xiàng)目時創(chuàng)建web.xml配置文件。


創(chuàng)建項(xiàng)目

創(chuàng)建項(xiàng)目后右鍵選中項(xiàng)目,添加框架支持,選中Maven,隨即生成pom.xml文件。這里會彈出Event對話框,會有提示你Enable Auto-Import,這里我們Enable一下。


添加框架

然后開始通過maven添加依賴jar包,引用Jersey,pom.xml配置如下:
    <groupId>com.overc_i3.jerseydemo</groupId>
    <artifactId>JerseyDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <!--maven默認(rèn)的java源值、目標(biāo)值版本是1.5,修改成1.8-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <jersey.version>2.25</jersey.version>
    </properties>

    <dependencies>
        <dependency>
            <!--jersey服務(wù)端包,將 Jersey 當(dāng)做 Servlet-->
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <!--服務(wù)端核心包-->
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <!--客戶端包,封裝了一些客戶端操作的類-->
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>
    </dependencies>

接下來是配置web.xml,項(xiàng)目里的路徑是web/WEB-INF/web.xml,這里我們將 Jersey 當(dāng)做 Servlet:

    <servlet>
        <!--Servlet配置-->
        <servlet-name>jerseyServlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <!--包名-->
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.overc_i3.jerseydemo</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jerseyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

也可將 Jersey 當(dāng)做 Servlet Filter,如下配置:

<filter>
        <filter-name>MyApplication</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            ...
        </init-param>
    </filter>
    ...
    <filter-mapping>
        <filter-name>MyApplication</filter-name>
        <url-pattern>/myApp/*</url-pattern>
    </filter-mapping>

<init-param> 元素內(nèi)容將取決于你如何決定資源配置不同的 Jersey 資源。

最后一步配置,在輸出中把jar包全部加進(jìn)去


在輸出中加入庫文件

配置完成,開始寫上API代碼,首先在src\main\java中根據(jù)之前配置的包建好對應(yīng)的包,我這里配置的是com\overc_i3\jerseydemo,這里使用Json做交互,先建model:

package com.overc_i3.model;

import java.util.List;

public class ReqJson {
    private String id;
    private List<ListBean> list;

    public List<ListBean> getList() {
        return list;
    }

    public void setList(List<ListBean> list) {
        this.list = list;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public static class ListBean {

        private String maxname;

        public String getMaxname() {
            return maxname;
        }

        public void setMaxname(String maxname) {
            this.maxname = maxname;
        }
    }
}

創(chuàng)建TestApi類:

package com.overc_i3.jerseydemo;

import com.overc_i3.model.ReqJson;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;

@Path("/")
public class TestApi {

    //GET注解設(shè)置接受請求類型為GET
    @GET
    // 與Produces對應(yīng)的是@Consumes
    @Produces(MediaType.TEXT_PLAIN)
    //用作測試服務(wù)啟動情況
    public String getMessage() {
        return "Hello world!";
    }

    @GET
    @Consumes(MediaType.TEXT_PLAIN)//注解指定解壓方式接收數(shù)據(jù)類型
    @Path("/hello")
    public Response postJson(@QueryParam("name") String name) {
        return Response.status(200).entity("hello "+name).build();
    }


    @POST
    @Consumes(MediaType.APPLICATION_JSON)//注解指定解壓方式接收數(shù)據(jù)類型
    @Produces(MediaType.APPLICATION_JSON)//注解指定壓縮方式返回?cái)?shù)據(jù)類型
    @Path("/postJson2")
    public Response postJson2(ReqJson msg) {
        ReqJson reqJson = new ReqJson();
        reqJson.setId(msg.getId());
        List<ReqJson.ListBean> listBeanList = new ArrayList<>();
        for (int i = 0; i < msg.getList().size(); i++) {
            ReqJson.ListBean listBean = new ReqJson.ListBean();
            listBean.setMaxname(msg.getList().get(i).getMaxname());
            listBeanList.add(listBean);
        }
        reqJson.setList(listBeanList);

        return Response.status(200).entity(reqJson).build();
    }
}

現(xiàn)在配置Tomcat運(yùn)行一下:
點(diǎn)擊Run >Edit Configurations… > “+” > Tomcat Server > Local,加入Tomcat,選擇Deployment tab, 點(diǎn)擊 “+”, 選擇唯一的Artifact,點(diǎn)擊"OK"即可。

Tomcat配置

配置好之后直接運(yùn)行,在瀏覽器訪問http://localhost:8080
默認(rèn)地址

Get hello

到這里RESTful API已經(jīng)正常運(yùn)行,接下來再用Fiddler調(diào)用API(注意設(shè)置請求格式Content-Type: application/json):


調(diào)用API

查看調(diào)API結(jié)果

到這里RESTful API已經(jīng)搭建完成,下面是部署的一些其它“姿勢”:

自定義 Application 子類

如果你的繼承 Application 類來提供有關(guān)根資源類的列表(getresources())和單身(getsingletons()),即你的 JAX-RS 應(yīng)用模型,然后你需要注冊一個 javax.ws.rs.Application [原名] 名稱的 Servlet 或 Servlet 過濾器作為 web 應(yīng)用程序的初始化參數(shù),在 web.xml 中進(jìn)行部署描述:
配置 Jersey 容器 Servlet 或者 過濾器來自定義 Application 子類

<init-param>
   <param-name>javax.ws.rs.Application</param-name>
   <param-value>org.foo.MyApplication</param-value>
</init-param>

Jersey 將考慮所有 Application 實(shí)現(xiàn)的 getClasses() 和 getSingletons() 方法的返回。
注意:JAX-RS 規(guī)范定義的配置名稱確實(shí)是 javax.ws.rs.Application 而不是 javax.ws.rs.core.Application

Jersey 掃描包

如果配置屬性無需設(shè)置,要部署應(yīng)用程序只包括存儲在特定的包的資源和提供者,那么你可以指示 Jersey 自動掃描這些包,這樣就能自動注冊找到的任何資源和提供者:
配置 Jersey 的 Servlet 或者 Filter 來掃描包

<init-param>
   <param-name>jersey.config.server.provider.packages</param-name>
   <param-value>
       org.foo.myresources,org.bar.otherresources
   </param-value>
</init-param>
<init-param>
   <param-name>jersey.config.server.provider.scanning.recursive</param-name>
   <param-value>false</param-value>
</init-param>

Jersey 將會自動發(fā)現(xiàn)被選中的資源和提供者。你可以通過設(shè)置 >jersey.config.server.provider.scanning.recursive 屬性來決定 Jersey 是否掃描子包。默認(rèn)值是 true , 即啟用遞歸掃描子包。
源碼:https://github.com/overclockingi3/JerseyDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,887評論 6 342
  • Java RESTful REST 服務(wù)類型在 REST 服務(wù)中,資源類是接收 REST 請求并完成響應(yīng)的核心類,...
    并肩走天涯閱讀 1,295評論 0 1
  • title: Java EE 7 Tutorial分析date: 2016-12-10 16:47:25catag...
    raincoffee閱讀 1,894評論 2 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • 原文鏈接:http://www.dropwizard.io/1.2.0/docs/getting-started....
    Lance_Xu閱讀 918評論 0 0