由于采用前後端分離的開發方式,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層方法使用範例
- 在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;
}
}
-
在攔截器等地方傳回,需要自行将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錯誤")
));
實際傳回結果
- 傳回成功,附帶資料
JSON
{
"code": 2000,
"message": "登入成功",
"data": {
"loginAccount": "admin_1",
"role": 1,
"loginTime": "2018-04-23 10:06:35"
}
}
- 傳回失敗,不附帶資料
{
"code":5000,
"message":"請求失敗",
"data":{}
}