springboot控制接口返回的字段_springboot接口返回封装与异常控制

该博客介绍了如何在SpringBoot中控制接口返回的字段,包括使用枚举类定义状态码,创建Response类进行封装,以及实现全局异常处理。通过@ControllerAdvice和@ExceptionHandler注解实现ApiException和一般Exception的捕获,返回定制化的错误信息。
摘要由CSDN通过智能技术生成

首先,返回有两个状态,status和code

status标识response的状态,有2个值:0成功,-1服务错误。

code跟业务有关,可以有各种数值,99999服务未知异常,10000参数异常,100001创建订单失败等等。这两个状态用枚举类表示。

ResponseStatus

/*** @Author: ivan

* @Description: 服务状态代码

* @Date: 18/11/26

* @Modified By;*/

public enumResponseStatus {

OK(0, "成功"),

ERROR(-1, "服务错误");private intvalue;privateString message;

ResponseStatus(intvalue, String message){this.value =value;this.message =message;

}public intgetValue() {returnvalue;

}publicString getMessage() {returnmessage;

}

}

ResponseCode

/*** @Author: ivan

* @Description: 业务状态代码

* @Date: 18/11/26

* @Modified By;*/

public enumResponseCode {

FORMAL(0, "业务正常"),

INVALID_PARAM(100000, "参数错误"),

UNKNOWN_FAILED(999999, "服务器未知错误"),

SAVE_FAILED(888888, "保存失败"),

UPDATE_FAILED(777777, "保存失败"),

DELTE_FAILED(666666, "删除失败"),

SEARCH_FLOW_FAILED(555555, "查询任务流的执行详情失败!");private intvalue;privateString message;

ResponseCode(intvalue, String message){this.value =value;this.message =message;

}public intgetValue() {returnvalue;

}publicString getMessage() {returnmessage;

}

}

然后,是Response类,简单工厂模式,提供build方法,创建正常返回和错误返回Response。

Response

/*** @Author: ivan

* @Description: 返回值封装

* @Date: Created in 17:26 18/11/26

* @Modified By:*/

public class Response implementsSerializable {private intstatus;private intcode;privateString message;privateObject data;publicResponse(ResponseStatus status, ResponseCode code, String message, T data) {this.setStatus(status);this.setCode(code);this.setMessage(message);this.setData(data);

}public static ResponsebuildSuccessResponse(T data) {return new Response(ResponseStatus.OK, ResponseCode.FORMAL, null, data);

}public static ResponsebuildFailResponse(ResponseStatus responseStatus, ResponseCode responseCode,

String message, T data) {return new Response(responseStatus, responseCode, message, data);

}public intgetStatus() {returnstatus;

}public voidsetStatus(ResponseStatus status) {this.status =status.getValue();

}public intgetCode() {returncode;

}public voidsetCode(ResponseCode code) {this.code =code.getValue();

}publicString getMessage() {returnmessage;

}public voidsetMessage(String message) {this.message =message;

}publicObject getData() {returndata;

}public voidsetData(Object data) {this.data =data;

}

}

如果不想在controller里try-catch一般的异常,并且在一定的条件下通过throw控制代码逻辑,我们需要建立ControllerAdvice。

我这个advice会捕捉ApiException(自定义),一般用业务Code码里的错误码和信息,这时候我们可以返回提示性异常。然后就是Exception普通异常,一般提示服务器未知错误。

我这里还处理了一个参数校验异常

/*** @Author: ivan

* @Description: 全局异常处理advice

* @Date: Created in 20:21 18/11/26

* @Modified By:*/@ControllerAdvicepublic classGlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理全局异常handler, ApiException为业务异常, 其他为服务器未知异常*/@ExceptionHandler(Exception.class)

@ResponseBodypublic Responsehandle(Exception e) {

Responseresponse;if (e instanceofApiException) {

ApiException error=(ApiException) e;

response=Response.buildFailResponse(ResponseStatus.ERROR, error.getResponseCode(),

error.getResponseCode().getMessage(),null);

}else{

response=Response.buildFailResponse(ResponseStatus.ERROR, ResponseCode.UNKNOWN_FAILED,

ResponseCode.UNKNOWN_FAILED.getMessage(),null);

}

logger.error("[Exception] message={}", e);returnresponse;

}/*** 处理参数校验异常handler*/@ExceptionHandler(ValidationException.class)

@ResponseBodypublic Responsehandle(ValidationException e) {

StringBuilder sb= newStringBuilder();if(e instanceofConstraintViolationException){

ConstraintViolationException error=(ConstraintViolationException) e;

Set> violations =error.getConstraintViolations();for (ConstraintViolation>item : violations) {

sb.append(item.getMessage());

}

}

logger.error("[Validation] message={}", sb.toString(), e);return Response.buildFailResponse(ResponseStatus.ERROR, ResponseCode.INVALID_PARAM, sb.toString(), null);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值