对外接口,除了返回成功的数据外,还需要返回一些状态和消息,比如成功,失败,IO异常,未找到,格式错误,ID错误等。我会习惯封装一个统一的枚举用来定义所有的状态枚举,然后定一个统一的返回对象,供供controller层调用。
这样的好处,所有的枚举统一维护。返回外部时格式统一。
一、定义枚举类
package com.cn.laoluobase.controller.obj;
import lombok.Getter;
@Getter
public enum MyHttpEnum {
// 枚举列表:
SUCCESS(1000,"成功"),
FAIL(999,"失败"),
NOTFOUND(404,"未找资资源");
// 枚举内部变量,msg\code.
private Integer code;
private String msg;
// 枚举类构造函数
MyHttpEnum(Integer code, String msg){
this.code = code;
this.msg = msg;
}
// 根据code返回枚举类
public static MyHttpEnum byCode(Integer code){
for (MyHttpEnum statusEnum : MyHttpEnum.values()) {
if (statusEnum.getCode().equals(code)) {
//如果需要直接返回name则更改返回类型为String,return statusEnum.name;
return statusEnum;
}
}
throw new IllegalArgumentException("code is invalid");
}
// 根据name返回枚举类
public static MyHttpEnum byName(String name){
for (MyHttpEnum statusEnum : MyHttpEnum.values()) {
if (statusEnum.name().equals(name)) {
//如果需要直接返回name则更改返回类型为String,return statusEnum.name;
return statusEnum;
}
}
throw new IllegalArgumentException("name is invalid");
}
}
二、定义一个统一的返回对象。
package com.cn.laoluobase.controller.obj;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultsObj {
private Integer code;
@JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
private Object data;
private String msg;
// 标准方法1-成功,返回code\data\msg
public static ResultsObj success(Object data){
return new ResultsObj(MyHttpEnum.SUCCESS.getCode(),data,MyHttpEnum.SUCCESS.getMsg());
}
// 标准方法2-失败,返回code\msg
public static ResultsObj fail(String msg){
return new ResultsObj(MyHttpEnum.FAIL.getCode(),null,msg);
}
// 按code去查找枚举类。使用久了可能会新增很多枚举列表,逐个写成标准方法有点累,直接调用这个就行了。
public static ResultsObj byCode(Integer code){
MyHttpEnum httpEnum=MyHttpEnum.byCode(code);
return new ResultsObj(httpEnum.getCode(),null, httpEnum.getMsg());
}
// 按name去查找枚举类。使用久了可能会新增很多枚举列表,逐个写成标准方法有点累,直接调用这个就行了。
public static ResultsObj byName(String name){
MyHttpEnum httpEnum=MyHttpEnum.byName(name);
return new ResultsObj(httpEnum.getCode(),null, httpEnum.getMsg());
}
}
注:byCode\byName是否返回data,可以自己修改。
三、Controller请求示例。
/**
* ResultsObj返回示例1-标准方法ResultsObj.success、fail等
* @return {
* "code": 1000,
* "data": 111111,
* "msg": "成功"
* }
* */
@PostMapping("/results1")
public ResultsObj post5(@RequestBody HashMap map){
// @RequestParam 定义参数
return ResultsObj.success(111111);
}
/**
* ResultsObj返回示例2-根据code返回枚举类
* @return {
* "code": 404,
* "msg": "未找资资源"
* }
* */
@PostMapping("/results2")
public ResultsObj post6(@RequestBody HashMap map){
return ResultsObj.byCode(404);
}
/**
* ResultsObj返回示例3-根据name返回枚举类
* @return {
* "code": 999,
* "msg": "失败"
* }
* */
@PostMapping("/results3")
public ResultsObj post7(@RequestBody HashMap map){
return ResultsObj.byName(MyHttpEnum.FAIL.name());
}
用枚举定义好处有很多,比如可以不断的维护枚举列表,而不用去修改代码,通过byName或byCode调用即可。