更多文章接口(findAll, update, delete)

之前已經(jīng)完成了添加文章和查詢的接口冬骚,接下來繼續(xù)實現(xiàn)以下接口

  1. 查詢所有
  2. 更新
  3. 刪除

Controller 層

在 postApi.java里面添加

    @GetMapping("")
    public List<Post> all() {
        return postService.all();
    }

    /**
     *  更新文章私恬,需要登錄
     * @param post  需要修改的內(nèi)容
     * @param id    文章 id
     * @param currentUser  當前用戶
     * @return 更新之后的文章
     */
    @LoginRequired
    @PutMapping("/{id}")
    public Post update(@RequestBody Post post, @PathVariable int id, @CurrentUser User currentUser) {
        post.setId(id);
        return postService.update(post, currentUser);
    }

    /**
     * 刪除文章,需要登錄
     * @param id 文章 id
     * @param currentUser 當前登錄用戶
     * @return 提示信息
     */
    @LoginRequired
    @DeleteMapping("/{id}")
    public Object delete(@PathVariable int id, @CurrentUser User currentUser) {
        postService.delete(id, currentUser);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", "刪除成功");
        return jsonObject;
    }

在這段代碼里面颠猴,使用了 @LoginRequired 注解保護更新和刪除接口(使用自定義注解實現(xiàn)登錄攔截)洛巢。同樣使用了 @CurrentUser 注解來注入當前登錄用戶(通過自定義注解獲取當前用戶)。
delete 方法請求成功之后返回 { "message": "刪除成功" }厦滤,和之前寫的請求錯誤時返回的格式一樣援岩。為了避免將來使用我們接口的人感到迷惑,將接口請求錯誤時的響應修改為 { "error": "error message" } 的形式:將 GlobalExceptionHandler.java 掏导、AuthenticationApi.java享怀、PostApi.java、UserApi.java 這幾個文件里面 jsonObject.put("message", "......"); 修改為 jsonObject.put("error", "......");

Service 層

在 postService.java 里面添加

    public List<Post> all() {
        return postMapper.all();
    }

    public Post update(Post post, User currentUser) {
        checkNotNull(post.getId(), "id不能為空");
        checkOwner(post.getId(), currentUser);
        postMapper.update(post);
        return findById(post.getId());
    }

    private void checkOwner(Integer id, User currentUser) {
        Post post = findById(id);
        if (!post.getAuthorId().equals(currentUser.getId())) {
            throw new RuntimeException("不能刪除或修改別人的文章");
        }
    }

    public void delete(int id, User currentUser) {
        checkOwner(id, currentUser);
        postMapper.delete(id);
    }

只有作者才可以更新自己的文章趟咆,所以添加一個 checkOwner 的私有方法添瓷。
update 方法里面使用了 Google GuavacheckNotNull 方法,當前也可以自己寫 if 語句判空值纱,但 Guava 提供很多功能鳞贷,能幫助我們編寫出更優(yōu)雅的代碼。
在 pom.xml 中添加 guava 的依賴

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
        </dependency>

更多Guava 相關(guān)的的知識可以看看使用Guava編寫優(yōu)雅代碼
checkNotNull是 Guava Preconditions 類里面的一個靜態(tài)方法虐唠,需要靜態(tài)導入

import static com.google.common.base.Preconditions.checkNotNull;

mapper

首先將 postMapperfindOne 拆成下面這種形式搀愧,select-post 那段 SQL 就可以在 all 方法中復用了

   <select id="findOne" resultMap="PostResultMap">
      <include refid="select-post" />
      <where>
          <if test="id!=null">
             AND post.id=#{id}
          </if>
      </where>
    </select>

    <select id="all" resultMap="PostResultMap">
      <include refid="select-post" />
    </select>

    <sql id="select-post" >
        SELECT
            post.id,
            post.author_id ,
            post.title ,
            post.content ,
            post.create_time ,
            post.update_time,
            <!-- 作者信息,password 不需要就不查了 -->
            `user`.id as author__id,
            `user`.`name` as author__name
        FROM post
        LEFT JOIN `user` ON `user`.id=post.author_id
    </sql>
    <select id="all" resultMap="PostResultMap">
      <include refid="select-post" />
    </select>

    <update id="update">
      UPDATE post
         <set>
             <if test="title!=null">
                 title=#{title},
             </if>
             <if test="content!=null">
                 content=#{content},
             </if>
         </set>
      where post.id=#{id}
    </update>

    <delete id="delete">
      DELETE FROM post WHERE post.id=#{id}
    </delete>

測試

啟動項目疆偿,使用 postman 測試一下三個接口

  1. GET api/post
  2. UPDATE api/post/{id}
  3. DELETE api/post/{id}

查看項目完整代碼

項目地址: https://github.com/hyrijk/spring-boot-blog
克隆項目到本地

git clone https://github.com/hyrijk/spring-boot-blog.git

checkout 到當前版本

git checkout 3594fc7eb5dddeec52ad5bddeedc06678178b5bd

完咱筛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杆故,隨后出現(xiàn)的幾起案子迅箩,更是在濱河造成了極大的恐慌,老刑警劉巖处铛,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沙热,死亡現(xiàn)場離奇詭異叉钥,居然都是意外死亡,警方通過查閱死者的電腦和手機篙贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門投队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爵川,你說我怎么就攤上這事敷鸦。” “怎么了寝贡?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵扒披,是天一觀的道長。 經(jīng)常有香客問我圃泡,道長碟案,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任颇蜡,我火速辦了婚禮价说,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘风秤。我一直安慰自己鳖目,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布缤弦。 她就那樣靜靜地躺著领迈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碍沐。 梳的紋絲不亂的頭發(fā)上狸捅,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音累提,去河邊找鬼尘喝。 笑死,一個胖子當著我的面吹牛刻恭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扯夭,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鳍贾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了交洗?” 一聲冷哼從身側(cè)響起骑科,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎构拳,沒想到半個月后咆爽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梁棠,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年斗埂,在試婚紗的時候發(fā)現(xiàn)自己被綠了符糊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡呛凶,死狀恐怖男娄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漾稀,我是刑警寧澤模闲,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站崭捍,受9級特大地震影響尸折,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殷蛇,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一实夹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晾咪,春花似錦收擦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昼蛀,卻和暖如春宴猾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叼旋。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工仇哆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夫植。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓讹剔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親详民。 傳聞我的和親對象是個殘疾皇子延欠,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)沈跨,斷路器由捎,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 在短暫的十八年生命里,印象中心肪,許久許久以前認識一個叫雪的姑娘锭亏。后來不知怎么就走散了,都走向了遠方的遠方蒙畴。 開始...
    逗霸君閱讀 409評論 0 6
  • 有段時間生活感覺到迷茫贰镣,不知道自己到底需要干什么,結(jié)婚兩年膳凝,被家人各種催要小孩碑隆,工作并不是我所企盼的那樣,老爸生病...
    女漢子阿雅閱讀 111評論 0 0
  • 結(jié)構(gòu)化思維三層次模型包括理解蹬音、重構(gòu)上煤、呈現(xiàn)三個模塊,在“重構(gòu)”這個層面著淆,作業(yè)中問題有:第一,沒有結(jié)論或沒有結(jié)論先...
    無憂俠閱讀 254評論 0 0