天天看點

[SpringMVC] Web層傳回值包裝JSON

由于采用前後端分離的開發方式,web層需傳回JSON形式的資料。

思路

  • 建立通用 請求響應類 Message.java
  • 使用jackson庫包裝請求響應Bean
  • 盡可能使用注解方式

代碼

  • jackson 依賴

    pom.xml

<!-- 用于SpringMVC自動轉換類為json -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.7.4</version>
</dependency>

<!-- 用于自己進行類和json的互相轉換 -->
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
           
  • 請求響應Bean類

    Message.java

package com.spz.demo.security.bean;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.spz.demo.security.common.MessageCode;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 請求響應Bean
 * 使用JSON包裝請求傳回,使用jackson庫
 *
 * @author spz
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Message implements Serializable {
    private int code ;
    private String message ;
    private Map<String,Object> data = new HashMap<String, Object>();

    /**
     * 自定義傳回
     * @param code
     * @param message
     * @return
     */
    public Message setMessage(int code, String message){
        this.code = code;
        this.message = message;
        return this;
    }

    /**
     * 傳回成功
     * @return
     */
    public Message setSuccessMessage(){
        this.code = MessageCode.SUCCESS ;
        this.message = "操作成功" ;
        return this;
    }

    /**
     * 傳回成功
     * @param message
     * @return
     */
    public Message setSuccessMessage(String message){
        this.code = MessageCode.SUCCESS ;
        this.message = message ;
        return this;
    }

    /**
     * 傳回錯誤
     * @param message
     * @return
     */
    public Message setErrorMessage(String message){
        this.code = MessageCode.ERROR ;
        this.message = message ;
        return this;
    }

    /**
     * 傳回警告
     * @param message
     * @return
     */
    public Message setWarnMessage(String message){
        this.code = MessageCode.WARN ;
        this.message = message ;
        return this;
    }

    /**
     * 傳回登入失敗
     * @param message
     * @return
     */
    public Message setLoginFailMessage(String message){
        this.code = MessageCode.LOGIN_FAILED ;
        this.message = message ;
        return this;
    }

    /**
     * 傳回沒有權限
     * @param message
     * @return
     */
    public Message setPermissionDeniedMessage(String message){
        this.code = MessageCode.PERMISSION_DENIED ;
        this.message = message ;
        return this;
    }
}

           

@JsonInclude(JsonInclude.Include.NON_NULL) 表示不解析為null的字段。

  • Message傳回碼

    MessageCode.java

package com.spz.demo.security.common;

public class MessageCode {

    // 請求成功
    public static int SUCCESS = 2000 ;
    // 警告
    public static int WARN = 2001;

    // token
    public static int TOKEN_ERROR = 4001;//token 不合法
    public static int TOKEN_OVERDUE = 4002;//token 已過期

    // 登入失敗
    public static int LOGIN_FAILED = 4003;

    // 沒有權限
    public static int PERMISSION_DENIED = 4004;

    // 伺服器處理失敗(常用錯誤)
    public static int ERROR = 5000 ;

}


           
  • Controller層方法使用範例
  1. 在Controller層使用,隻需要在方法上使用*ResponseBody注解即可,SpringMVC會自動将方法傳回的Message轉為json
@Controller
@RequestMapping("/admin")
public class AdminController{

    // 使用者登入方法
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public Message login(HttpServletRequest request)throws Exception{
        //.....業務邏輯代碼

        // 1. 傳回成功,附帶資料
        Message rest = new Message(). setSuccessMessage("登入成功");
        rest.getData().put("loginAccount",account);//可添加一些需要顯示的資料
        rest.getData().put("role",1);//登入人權限
        rest.getData().put("loginTime",new Date());//登入時間
        //return rest;//Controller方法傳回

        // 2. 傳回失敗,不附帶資料
        //return new Message().setErrorMessage("請求失敗,xxx")
        return rest;
    }
}

           
  1. 在攔截器等地方傳回,需要自行将Message類轉為json字元串,寫入response流

    輸出到response工具方法WebUtil.writeJSONToResponse()

/**
     * 輸出json字元串到 HttpServletResponse
     * @param response
     * @param str : 字元串
     */
    public static void writeJSONToResponse(HttpServletResponse response, String str){
        PrintWriter jsonOut = null;
        response.setContentType("application/json;charset=UTF-8");
        try {
            jsonOut = response.getWriter();
            jsonOut.write(str);
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            if(jsonOut != null){
                jsonOut.close();
            }
        }
    }
           

使用Message和json工具類

注意JSON.toJSONString()是fastjson裡的。

WebUtil.writeJSONToResponse(httpServletResponse,JSON.toJSONString(
    new Message().setErrorMessage("xxx錯誤")
));
           

實際傳回結果

  1. 傳回成功,附帶資料

JSON

{
  "code": 2000,
  "message": "登入成功",
  "data": {
           "loginAccount": "admin_1",
           "role": 1,
           "loginTime": "2018-04-23 10:06:35"
  }
}
           
  1. 傳回失敗,不附帶資料
{
 "code":5000,
 "message":"請求失敗",
 "data":{}
}
           
參考Demo
SpringBoot小項目快速搭建