1. 统一响应大对象
resultCode:返回结果码 1 成功 0 失败
message:提示信息
data:响应结果数据
package com.hogwartstest.aitestmini.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 响应返回类
* @author tlibn
* @description
* @create 2019-08-02
*/
@ApiModel(value="基础返回类",description="基础返回类")
public class ResultDto<T> implements Serializable {
private static final long serialVersionUID = -7472879865481412372L;
@ApiModelProperty(value="返回结果码 1 成功 0 失败", required = true, example="1",allowableValues = "1,0")
private Integer resultCode;
@ApiModelProperty(value="提示信息", example="成功",allowableValues = "成功,失败")
private String message = "";
@ApiModelProperty(value="响应结果数据")
private T data = null;
public Integer getResultCode() {
return resultCode;
}
public static ResultDto newInstance(){
return new ResultDto();
}
/**
* 设置为成功状态
*/
public void setAsSuccess() {
this.resultCode = 1;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public static ResultDto success(String message){
ResultDto resultDto = new ResultDto();
resultDto.setAsSuccess();
resultDto.setMessage(message);
return resultDto;
}
public static <T> ResultDto<T> success(String message,T data){
ResultDto<T> resultDto = new ResultDto<>();
resultDto.setAsSuccess();
resultDto.setMessage(message);
resultDto.setData(data);
return resultDto;
}
/**
* 设置为失败状态
*/
public void setAsFailure() {
this.resultCode = 0;
}
public static <T> ResultDto<T> fail(String message){
ResultDto<T> resultDto = new ResultDto<>();
resultDto.setAsFailure();
resultDto.setMessage(message);
return resultDto;
}
public static <T> ResultDto<T> fail(String message,T data){
ResultDto<T> resultDto = new ResultDto<>();
resultDto.setAsFailure();
resultDto.setMessage(message);
resultDto.setData(data);
return resultDto;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
2. 应用
Controller改造:
@Operation(summary = "用户登录接口")
@PostMapping("login") // 简化上面的操作
public ResultDto<UserDto> login(@RequestBody UserDto userDto){
String res = iTestUserService.login(userDto);
if (userDto.getUsername().contains("error2")){
throw new NullPointerException();
}
if (userDto.getUsername().contains("error")){
ServiceException.throwEx("用户命中有error");
}
return ResultDto.success("success with userDto - " + res + "\niTest.env=" + envValue, userDto);
}
全局异常捕获改造:
package com.itestmini.testplatformbackend.common;
import com.itestmini.testplatformbackend.dto.ResultDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
/**
* @author moso
* @Date 2024/12/23 23:35
* 该类需要能捕获 1.业务异常
* 2. 非业务异常
* 3. 其他异常
*/
@Slf4j
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
//业务异常
@ExceptionHandler({ServiceException.class})
public ResultDto serviceExceptionHandler(ServiceException se){
return resultFormat(se);
}
//非业务异常
@ExceptionHandler({Exception.class})
public ResultDto exception(Exception e){
return resultFormat(e);
}
@ExceptionHandler({Throwable.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultDto exception(Throwable throwable){
return resultFormat(throwable);
}
public ResultDto resultFormat(Throwable t){
log.error(t.getMessage());
String tips = "系统繁忙,请稍后再试";
if (t instanceof ServiceException){
return ResultDto.fail("业务异常 " + tips);
}
if(t instanceof Exception){
return ResultDto.fail("非业务异常 " + tips);
}
return ResultDto.fail(tips);
}
}
执行结果展示:
3. 分页
请求:
package com.itestmini.testplatformbackend.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* @author moso
* @Date 2024/12/25 22:50
*/
@Data
@Schema(name="列表查询的分页参数",description="请求参数类")
public class PageTableRequest<Dto extends BaseDto> implements Serializable {
private static final long serialVersionUID = 7328071045193618467L;
@Schema(name="页码",required=true, example = "1")
private Integer pageNum = 1;
@Schema(name="每页数据量",required=true, example = "10")
private Integer pageSize = 10;
@Schema(name="特定查询参数",required=true, example = "status=1")
private Dto params;
}
响应:
package com.itestmini.testplatformbackend.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author moso
* @Date 2024/12/25 22:53
*/
@Data
@Schema(name="列表查询的分页返回",description="返回结果类")
public class PageTableResponse<T> implements Serializable {
private static final long serialVersionUID = 620421858510718076L;
@Schema(name="共计返回数量",required=true, example = "10")
private Integer recordsTotal;
@Schema(name="返回结果对象",required=true)
private List<T> data;
}
提交:
https://gitee.com/moso520/test-platform-backend.git
3818fef