之前封装了一个响应实体类,但是返回值没有使用泛型,而是直接使用Object对象,这样使用起来还是不太好,返回值不能在controller中一眼看到,而是要看具体代码,今天再封装一个返回值为泛型的响应实体类
1、定义响应状态码枚举类,枚举类用来定义项目中要使用到的状态码
/**
* @author gain
* @title 响应消息枚举
*/
public enum ResponseEnum {
// 可以根据自己的实际需要增加状态码
SUCCESS("0", "ok"),
SERVER_INNER_ERR("500","系统繁忙"),
PARAM_LACK("100" , "非法参数"),
OPERATION_FAILED("101" ,"操作失败"),
;
private String code;
private String msg;
ResponseEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
2、定义响应实体类,在这里引用ResponseEnum枚举,定义了响应消息和响应数据对象若干方法(也可以将上面的ResponseEnum枚举直接定义在该类内部,看个人喜好)
import com.fasterxml.jackson.annotation.JsonInclude;
/**
* @author gavin
* @title 响应实体类
* @param <T>
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> {
private String code;
private String msg;
private T data;
/**
* @title 成功消息
* @param ResponseEnum
* @return
*/
public static <T> Response<T> success() {
return rspMsg(ResponseEnum.SUCCESS);
}
/**
* @title 失败消息
* @param ResponseEnum
* @return
*/
public static <T> Response<T> fail() {
return rspMsg(ResponseEnum.SERVER_INNER_ERR);
}
/**
* @title 自定义消息
* @param ResponseEnum
* @return
*/
public static <T> Response<T> rspMsg(ResponseEnum responseEnum) {
Response<T> message = new Response<T>();
message.setCode(responseEnum.getCode());
message.setMsg(responseEnum.getMsg());
return message;
}
/**
* @title 自定义消息
* @param errcode
* @param errmsg
* @return
*/
public static <T> Response<T> rspMsg(String code , String msg) {
Response<T> message = new Response<T>();
message.setCode(code);
message.setMsg(msg);
return message;
}
/**
* @title 返回数据
* @param data
* @return
*/
public static <T> Response<T> rspData(T data) {
Response<T> responseData = new Response<T>();
responseData.setCode(ResponseEnum.SUCCESS.getCode());
responseData.setData(data);
return responseData;
}
/**
* @title 返回数据-自定义code
* @param data
* @return
*/
public static <T> Response<T> rspData(String code , T data) {
Response<T> responseData = new Response<T>();
responseData.setCode(code);
responseData.setData(data);
return responseData;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
3、在controller中使用响应实体类,在controller中展示了响应消息和响应数据的例子
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("student")
public class StudentController {
/**
* @title 返回数据
* @return
*/
@GetMapping("studentInfo")
public Response<Student> studentInfo() {
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(30);
return Response.rspData(student);
}
/**
* @title 返回成功消息
* @return
*/
@GetMapping("success")
public Response<String> success() {
// 逻辑代码
return Response.success();
}
/**
* @title 返回失败消息
* @return
*/
@GetMapping("fail")
public Response<String> fail() {
// 逻辑代码
return Response.fail();
}
/**
* @title 返回自定义消息
* @return
*/
@GetMapping("msg")
public Response<String> msg() {
// 逻辑代码
// 返回操作失败
return Response.rspMsg(ResponseEnum.OPERATION_FAILED);
}
}
使用postman访问以上接口,响应结果如下图所示