Springboot統合インタフェースはデータを返します
一、異常がない場合、正常にデータを返す
インタフェースで統一的に返されるデータフォーマットは次のとおりです.
インタフェースデータに対応するbean
Resultエンティティを操作するツールクラス
エラー・コードとエラー・メッセージをカプセル化する列挙クラス
結果の断面を統一的にカプセル化
この接面が必要なのは、ControllerメソッドごとにResultUtilsが呼び出されないようにするためである.success().この接面があれば、Controllerは元のようにオブジェクト、文字列、voidを正常に返すことができ、接面の中で結果をResultエンティティにカプセル化し、各ControllerメソッドがResultエンティティに戻る必要はありません.
二、異常がある場合
サービスレイヤは、トランザクションを自動的にロールバックするために、カスタムRuntimeExceptionをいくつか放出します.デフォルトでは、トランザクションがロールバックされるのはRuntimeExceptionのみです.Controllerの中でサービス層から放出された異常を直接処理すると、Controllerの中にはtry catchブロックがあちこちにあり、コードが見苦しい.異常を一つの場所に集中して処理するとずっとよくなります.Springbootでは@ControllerAdviceと@ExceptionHandlerにより統合例外処理が完了している.この2つの注記は、Controllerとブロッカーから放出された異常のみを処理し、他の場所から放出された異常(Filterから放出された異常など)は、キャプチャできません.他の場所から放出された例外は/errorのControllerメソッドに移行し、デフォルトではBasicErrorControllerが処理します.他の場所から放出された例外を処理できるように、ErrorControllerをカスタマイズします.
統合された例外処理クラス、Controllerとブロッキングから放出された例外の処理
カスタム例外クラスの例
他の場所から放出された例外(Controllerやブロッキングから放出された例外ではない)を処理し、ErrorControllerをカスタマイズします.
ErrorControllerでのエラー処理をカスタマイズする方法では、例外を直接放出することもできます.これにより、例外は統合例外プロセッサに渡されて処理されます.
インタフェースで統一的に返されるデータフォーマットは次のとおりです.
{
"status": 0,
"msg": " ",
"data": null
}
インタフェースデータに対応するbean
/**
*
* @param
*/
public class Result implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private int status;
/**
*
*/
private String msg;
/**
*
*/
private T data;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
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;
}
}
Resultエンティティを操作するツールクラス
/**
* result ,
*/
public class ResultUtils {
/**
* result ,
*/
public static Result success(T t){
Result result = new Result<>();
result.setStatus(ResultEnum.SUCCESS.getCode());
result.setMsg(ResultEnum.SUCCESS.getMsg());
result.setData(t);
return result;
}
/**
* result ,
*/
public static Result success(){
return success(null);
}
/**
* result
*/
public static Result error(int status, String msg){
Result result = new Result<>();
result.setStatus(status);
result.setMsg(msg);
return result;
}
}
エラー・コードとエラー・メッセージをカプセル化する列挙クラス
/**
*
*/
public enum ResultEnum {
UNKNOWN_ERROR(-1, " "),
SUCCESS(0, " "),
BASIC_INFO_ID_IS_EMPTY(600, " BasicInfoId "),
BASIC_INFO_ADD_TO_DATABASE_FAILURE(601, " "),
DETAILS_DATA_BASIC_INFO_ID_IS_EMPTY(602, " BasicInfoId "),
DETAILS_DATA_ADD_TO_DATABASE_FAILURE(603, " ");
ResultEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "ResultEnum{" +
"code=" + code +
", msg='" + msg + '\'' +
'}';
}
}
結果の断面を統一的にカプセル化
この接面が必要なのは、ControllerメソッドごとにResultUtilsが呼び出されないようにするためである.success().この接面があれば、Controllerは元のようにオブジェクト、文字列、voidを正常に返すことができ、接面の中で結果をResultエンティティにカプセル化し、各ControllerメソッドがResultエンティティに戻る必要はありません.
/**
* , controller ResultUtils.success()
*
*/
@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice
二、異常がある場合
サービスレイヤは、トランザクションを自動的にロールバックするために、カスタムRuntimeExceptionをいくつか放出します.デフォルトでは、トランザクションがロールバックされるのはRuntimeExceptionのみです.Controllerの中でサービス層から放出された異常を直接処理すると、Controllerの中にはtry catchブロックがあちこちにあり、コードが見苦しい.異常を一つの場所に集中して処理するとずっとよくなります.Springbootでは@ControllerAdviceと@ExceptionHandlerにより統合例外処理が完了している.この2つの注記は、Controllerとブロッカーから放出された異常のみを処理し、他の場所から放出された異常(Filterから放出された異常など)は、キャプチャできません.他の場所から放出された例外は/errorのControllerメソッドに移行し、デフォルトではBasicErrorControllerが処理します.他の場所から放出された例外を処理できるように、ErrorControllerをカスタマイズします.
統合された例外処理クラス、Controllerとブロッキングから放出された例外の処理
/**
*
*/
@ControllerAdvice
public class MyExceptionHandler {
/**
* /error, BasicErrorController ,
* BasicErrorController springboot
*/
/*@ExceptionHandler(BasicInfoException.class)
public String handleException(Exception ex, HttpServletRequest request){
request.setAttribute("javax.servlet.error.status_code", 401);
request.setAttribute("exMsg", ex.getMessage());
return "forward:/error";
}*/
/**
*
*/
@ExceptionHandler(BasicInfoException.class)
@ResponseBody
public Result handleBasicInfoException(BasicInfoException ex){
return ResultUtils.error(ex.getCode(), ex.getMessage());
}
/**
*
*/
@ExceptionHandler(DetailsDataException.class)
@ResponseBody
public Result handleDetailsDataException(DetailsDataException ex){
return ResultUtils.error(ex.getCode(), ex.getMessage());
}
/**
*
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleUnKnowException(Exception ex){
return ResultUtils.error(ResultEnum.UNKNOWN_ERROR.getCode(), ex.getMessage());
}
}
カスタム例外クラスの例
public class BasicInfoException extends RuntimeException {
private int code;
public BasicInfoException(int code, String msg){
super(msg);
this.code = code;
}
public int getCode() {
return code;
}
}
他の場所から放出された例外(Controllerやブロッキングから放出された例外ではない)を処理し、ErrorControllerをカスタマイズします.
/**
* ErrorController, ( Controller )
*/
@Controller
public class MyBasicErrorController extends AbstractErrorController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* @Value
*/
@Value("${server.error.path}")
private String myPath;
private final ErrorProperties errorProperties;
private ErrorAttributes mErrorAttributes;
public MyBasicErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties) {
super(errorAttributes);
this.errorProperties = serverProperties.getError();
this.mErrorAttributes = errorAttributes;
}
//@RequestMapping(value = "/error")
@RequestMapping("${server.error.path}") // properties
@ResponseBody
public Result
ErrorControllerでのエラー処理をカスタマイズする方法では、例外を直接放出することもできます.これにより、例外は統合例外プロセッサに渡されて処理されます.
//@RequestMapping(value = "/error")
@RequestMapping("${server.error.path}") // properties
@ResponseBody
public Result