le mie informazioni di contatto
Posta[email protected]
2024-07-06
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Quando si sviluppano applicazioni Spring Boot, il modo in cui vengono gestiti i risultati della risposta e le eccezioni ha un impatto cruciale sulla manutenibilità, scalabilità e collaborazione del team del progetto. I risultati di risposta dispersi e la logica di gestione delle eccezioni spesso portano a codice ridondante difficile da comprendere e mantenere. Pertanto, la restituzione unificata dei risultati e la gestione unificata delle eccezioni sono una delle strategie chiave per migliorare la qualità del progetto.
Unificare i risultati restituiti di solito significa definire un formato di risposta standard per tutti i metodi del controller. Ciò può essere ottenuto creando una o più classi di entità di risposta che contengono campi comuni come codice di stato, messaggio e dati. Dopo che il metodo del controller ha elaborato la logica aziendale, popolerà questi campi e li restituirà al client.
Successivamente, diamo un'occhiata a come ottenere un ritorno di risultati unificato in SpringBoot.
1. Definire un oggetto di risposta comune
Creare un oggetto di risposta generico, definire gli scenari di restituzione di esito positivo e negativo e assicurarsi che l'oggetto di restituzione generico venga utilizzato nell'interfaccia.
public class ResponseResult {
private int code;
private String message;
private Object data;
public static ResponseResult success(Object data) {
ResponseResult responseResult = new ResponseResult();
responseResult.setData(data);
responseResult.setCode(ResultEnum.SUCCESS.code);
return responseResult;
}
public static ResponseResult error(ResultEnum resultEnum) {
return error(resultEnum, resultEnum.message);
}
public static ResponseResult error(ResultEnum resultEnum, String message) {
ResponseResult responseResult = new ResponseResult();
responseResult.setCode(resultEnum.code);
responseResult.setMessage(message);
return responseResult;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
2. Definire il codice di stato della risposta dell'interfaccia
La definizione di un insieme comune di codici di stato è una delle chiavi fondamentali per ottenere un risultato unificato. Questo approccio non solo migliora l'usabilità e la manutenibilità dell'API, ma consente anche al client di analizzare ed elaborare i dati di risposta in modo più efficiente. Fornisce inoltre agli sviluppatori API uno standard chiaro e coerente da seguire.
public enum ResultEnum {
SUCCESS(200 ,"请求处理成功"),
SERVICE_ERROR(500, "服务器异常,请稍后重试");
public final Integer code;
public final String message;
ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
3. Definire metodi unificati di gestione dei successi e degli insuccessi
public class ResponseResult {
private int code;
private String message;
private Object data;
public static ResponseResult success(Object data) {
ResponseResult responseResult = new ResponseResult();
responseResult.setData(data);
responseResult.setCode(ResultEnum.SUCCESS.code);
return responseResult;
}
public static ResponseResult error(ResultEnum resultEnum) {
return error(resultEnum, resultEnum.message);
}
public static ResponseResult error(ResultEnum resultEnum, String message) {
ResponseResult responseResult = new ResponseResult();
responseResult.setCode(resultEnum.code);
responseResult.setMessage(message);
return responseResult;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
4. Il controller risponde in modo uniforme ai risultati
@GetMapping("/testResult")
public ResponseResult test() {
// 模拟业务逻辑
try {
// 假设这里有一些业务逻辑
return ResponseResult.success("success");
} catch (Exception e) {
// 捕获异常并返回错误信息
return ResponseResult.error(ResultEnum.SERVICE_ERROR);
}
}
La gestione unificata delle eccezioni utilizza un gestore di eccezioni globale per acquisire e gestire le eccezioni generate nel controller. Questo approccio evita di scrivere codice di gestione delle eccezioni duplicato in ciascun metodo del controller e rende inoltre la logica di gestione delle eccezioni più centralizzata e più semplice da gestire.
@RestControllerAdvice
@RestControllerAdvice è un'annotazione combinata, ovvero una combinazione di @ControllerAdvice e @ResponseBody. Viene utilizzato principalmente per fornire una configurazione globale per il livello controller, come la gestione delle eccezioni, l'associazione dei dati, la preelaborazione dei dati, ecc. Poiché contiene @ResponseBody, tutti i metodi elaborati da @RestControllerAdvice scriveranno il valore restituito nel corpo della risposta HTTP per impostazione predefinita e imposteranno il Content-Type appropriato.
@GestioneEccezioneR
L'annotazione @ExceptionHandler viene utilizzata per contrassegnare un metodo che gestisce le eccezioni generate nel controller. Quando un metodo nel controller genera un'eccezione, Spring cercherà un metodo annotato @ExceptionHandler in grado di gestire l'eccezione. In tal caso, viene chiamato il metodo e viene restituita la sua risposta.
Avviso
当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。
1. Definire le classi di eccezioni aziendali
Le classi di eccezioni unificate possono aiutarti a gestire meglio errori ed eccezioni, rendendo la gestione degli errori in tutto il sistema più coerente e prevedibile.
public class BusinessException extends RuntimeException{
private final ResultEnum resultEnum;
public BusinessException(ResultEnum resultEnum, String message) {
super(message);
this.resultEnum = resultEnum;
}
public BusinessException(ResultEnum resultEnum) {
this(resultEnum, resultEnum.message);
}
}
2. Gestore delle eccezioni globali
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({BusinessException.class})
public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
// 想处理的业务
return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
}
/**
* 其他异常
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public ResponseResult handleOtherExceptions(Exception e) {
// 这里可以根据不同的异常类型返回不同的状态码和消息
// 但为了简单起见,这里只返回一个通用的错误信息
return ResponseResult.error(ResultEnum.SERVICE_ERROR);
}
}
3. Elaborazione e utilizzo unificati
@GetMapping("/testException1")
public ResponseResult test1() {
if (true) {
// 业务场景
throw new BusinessException(ResultEnum.SERVICE_ERROR);
}
return ResponseResult.success("success");
}
Vantaggi derivanti dall'utilizzo della gestione unificata delle eccezioni
riutilizzo del codice: evitare di scrivere risultati di risposta simili e codici di gestione delle eccezioni in più posti.
Facile da mantenere: quando è necessario modificare il formato della risposta o la logica di gestione delle eccezioni, è sufficiente modificarli in un unico punto.
Lavoro di squadra: i membri del team possono comprendere e seguire più facilmente gli standard di codifica unificati.
Scalabilità: se è necessario aggiungere nuovi tipi di risposta o logica di gestione delle eccezioni, è sufficiente estendere quelli esistenti.