springboot做統一格式返回
阿新 • • 發佈:2022-04-02
- message類。確定返回格式
package com.dbhd.gvs.common.result; import org.springframework.http.HttpStatus; public class Message<T> { String status; //向前端返回的內容 String message; T data; public Message() { } public Message(String status, String message) { this.status = status; this.message = message; } public Message(String status, String message, T data) { this.data = data; this.status = status; this.message = message; } public static <T> Message<T> custom(String status, String message, T data) { return new Message(status, message, data); } public static <T> Message<T> custom(String status, String message) { return new Message(status, message); } public static HttpStatus num2HttpStatus(String code) { HttpStatus status = HttpStatus.NOT_FOUND; for (HttpStatus httpStatus : HttpStatus.values()) { boolean b = Integer.parseInt(code) == httpStatus.value(); if (b) { return httpStatus; } } return status; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
- ResultVo統一返回格式
package com.dbhd.gvs.common.result; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; /** * 統一返回格式,錯誤處理 * * @param <T> */ public class ResultVo<T> extends ResponseEntity<Message> { public ResultVo(HttpStatus status) { super(status); } public ResultVo(String code, String msg) { super(Message.custom(code, msg), Message.num2HttpStatus(code)); } public ResultVo(String code, String msg, T data) { super(Message.custom(code, msg, data), Message.num2HttpStatus(code)); } public static <T> ResultVo<T> success(T data) { return new ResultVo("200", "成功", data); } public static <T> ResultVo<T> saveSuccess(T data) { return new ResultVo("201", "新增成功", data); } public static <T> ResultVo<T> failed(T data) { return new ResultVo("422", "失敗", data); } public static <T> ResultVo<T> failMsg(String msg) { return new ResultVo("422", msg); } public static <T> ResultVo<T> custom(String code, String msg, T data) { return new ResultVo(code, msg, data); } public static <T> ResultVo<T> custom(String code, String msg) { return new ResultVo(code, msg); } }
- 不同錯誤處理,以BadRequestException舉例
package com.dbhd.gvs.common.exception; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.web.bind.annotation.ResponseBody; @ResponseBody @Data @EqualsAndHashCode(callSuper = true) public class BadRequestException extends Exception{ public BadRequestException(String msg) { this.msg = msg; } private final String code = "400"; private String msg; }
MyControllerAdvide類處理錯誤類:
package com.dbhd.gvs.common.exception;
import com.dbhd.gvs.common.result.ResultVo;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Objects;
@RestControllerAdvice
public class MyControllerAdvice {
/**
* 自定義捕捉異常
* @param ex
* @return
*/
@ExceptionHandler(CustomException.class)
public ResultVo myErrorHandler(CustomException ex) {
return ResultVo.custom(ex.getCode(), ex.getMsg());
}
/**
*
* @param ex
* @return
*/
@ExceptionHandler(NotFoundException.class)
public ResultVo NotFoundException(NotFoundException ex) {
return ResultVo.custom(ex.getCode(), ex.getMsg());
}
@ExceptionHandler(BadRequestException.class)
public ResultVo BadRequestException(BadRequestException ex) {
return ResultVo.custom(ex.getCode(), ex.getMsg());
}
/**
* validator註解校驗返回 攔截表單引數校驗
* @param ex
* @return
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler({BindException.class})
public ResultVo bindException(BindException ex) {
System.out.println("--bindException---");
BindingResult bindingResult = ex.getBindingResult();
return ResultVo.custom("400", Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
/**
* validator註解校驗返回 攔截JSON引數校驗
* @param ex
* @return
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVo bindException(MethodArgumentNotValidException ex) {
System.out.println("----攔截JSON引數校驗-----");
BindingResult bindingResult = ex.getBindingResult();
StringBuilder errorMessage = new StringBuilder(bindingResult.getFieldErrors().size() * 16);
// errorMessage.append("Invalid Request:");
for (int i = 0; i < bindingResult.getFieldErrors().size(); i++) {
if (i > 0) {
errorMessage.append(", ");
}
FieldError fieldError = bindingResult.getFieldErrors().get(i);
errorMessage.append(fieldError.getField());
errorMessage.append(": ");
errorMessage.append(fieldError.getDefaultMessage());
}
return ResultVo.custom("400", errorMessage.toString());
}
}
controller使用:
public class CoordinateController {
@Autowired
CoordinateService coordinateService;
@GetMapping
@ApiOperation("所有座標列表")
public ResultVo get() throws Exception {
List<Coordinate> list = coordinateService.getList();
return ResultVo.success(list);
}
serveice使用錯誤處理:
@Override
public Coordinate update(CoordinateDto dto) throws NotFoundException {
Coordinate coordinate = coordinateDao.getById(dto.getCoordinateId());
if (coordinate == null) {
throw new NotFoundException("座標不存在,可以先新增");
}
coordinate.setCoordinate(dto.getCoordinate());
coordinateDao.update(coordinate);
return coordinate;
}