由于采用前后端分离的开发方式,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"
}
}
- 返回失败,不附带数据
JSON
{
"code":5000,
"message":"请求失败",
"data":{}
}