SpringBoot ialah produk yang dilahirkan untuk memudahkan satu siri isu seperti penciptaan, jalankan, penyahpepijatan dan penggunaan aplikasi Spring konfigurasi. Kami Hanya mengikut spesifikasi dan memperkenalkan kebergantungan yang berkaitan untuk membina projek WEB dengan mudah
Dalam pembangunan projek sebenar, pelbagai situasi tidak normal sering berlaku dalam program, terutamanya sebagai pelayan Sebagai pembangun, kami sentiasa menulis antara muka untuk menyediakan panggilan hadapan Dalam kes pembahagian kerja dan kerjasama, pengecualian tidak boleh dielakkan Jika maklumat yang salah didedahkan secara langsung kepada pengguna, pengalaman itu boleh dibayangkan, dan ia akan membahayakan pengguna . Untuk penggodam, maklumat pengecualian terperinci selalunya sangat membantu...
Gunakan kaedah cuba-tangkap untuk menangkap maklumat pengecualian secara manual dan kemudian mengembalikan set hasil yang sepadan. (Contohnya: dirangkumkan ke dalam objek Hasil); walaupun kaedah ini secara tidak langsung menyelesaikan masalah pendedahan ralat, kelemahan yang sama juga jelas, meningkatkan jumlah kod Apabila terdapat terlalu banyak pengecualian, lapisan tangkapan yang sepadan menjadi lebih banyak banyak. Sukar untuk menguruskan pemadanan antara pengecualian perniagaan dan kod ralat ini, jadi cara terbaik ialah mengawal situasi global melalui konfigurasi mudah...
Mari kita lihat penyelesaian yang disediakan oleh Spring Boot
Tambahkan kebergantungan spring-boot-starter-web dalam pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
Pengecualian tersuai
Semasa proses pembangunan aplikasi, kecuali Dalam Selain pengecualian sistem itu sendiri, pengecualian yang digunakan dalam senario perniagaan yang berbeza juga berbeza Untuk menjadi lebih relevan dengan tajuk "Pengecualian global yang mudah dikendalikan", tentukan pengecualian anda sendiri dan lihat cara untuk menangkap...<.>
package com.battcn.exception; /** * 自定义异常 * * @author Levin * @since public class CustomException extends RuntimeException private static final long serialVersionUID = 4564124491192825748L; private int code; public CustomException() { super(); } public CustomException(int code, String message) { super(message); this.setCode(code); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }2 Templat maklumat pengecualian mentakrifkan format maklumat pengecualian yang dikembalikan, supaya gaya maklumat pengecualian lebih bersatu
package com.battcn.exception; /** * @author Levin * @since public class ErrorResponseEntity private int code; private String message; // 省略 get set3 Lapisan kawalan Lihat lebih dekat untuk melihat sama ada ia sama dengan kod yang ditulis seperti biasa Apa bezanya, jom baca terus...
package com.battcn.controller; import com.battcn.exception.CustomException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * 全局异常演示 * * @author Levin * @since @RestController public class ExceptionController @GetMapping("/test3") public String test3(Integer num) { // TODO 演示需要,实际上参数是否为空通过 @RequestParam(required = true) 就可以控制 if (num == null) { throw new CustomException(400, "num不能为空"); } int i = 10 / num; return "result:"4 Pengendalian pengecualian (kunci)
@ControllerAdviceTangkap pengecualian yang dilemparkan oleh lapisan Pengawal Jika @ResponseBody ditambahkan, maklumat pemulangan akan berada dalam format JSON.
@RestControllerAdvice adalah bersamaan dengan gabungan @ControllerAdvice dan @ResponseBody.
@ExceptionHandlerMengendalikan satu jenis pengecualian secara seragam untuk mengurangkan pertindihan dan kerumitan kod.
package com.battcn.config; import com.battcn.exception.CustomException; import com.battcn.exception.ErrorResponseEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.context.request.WebRequest; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 全局异常处理 * * @author Levin * @since @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler /** * 定义要捕获的异常 可以多个 @ExceptionHandler({}) * * @param request request * @param e exception * @param response response * @return @ExceptionHandler(CustomException.class) public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { response.setStatus(HttpStatus.BAD_REQUEST.value()); CustomException exception = (CustomException) e; return new ErrorResponseEntity(exception.getCode(), exception.getMessage()); } /** * 捕获 RuntimeException 异常 * TODO 如果你觉得在一个 exceptionHandler 通过 if (e instanceof xxxException) 太麻烦 * TODO 那么你还可以自己写多个不同的 exceptionHandler 处理不同异常 * * @param request request * @param e exception * @param response response * @return @ExceptionHandler(RuntimeException.class) public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { response.setStatus(HttpStatus.BAD_REQUEST.value()); RuntimeException exception = (RuntimeException) e; return new ErrorResponseEntity(400, exception.getMessage()); } /** * 通用的接口映射异常处理方 */ @Override protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { if (ex instanceof MethodArgumentNotValidException) { MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex; return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status); } if (ex instanceof MethodArgumentTypeMismatchException) { MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex; logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName() + ",信息:" + exception.getLocalizedMessage()); return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status); } return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status); } }UjianSelepas melengkapkan persediaan, mulakan Aplikasi Bab17 Daripada keputusan ujian di bawah, anda boleh mendapati bahawa ia sangat mudah, kod telah menjadi lebih bersih, dan skalabiliti juga telah bertambah baik...
Lawati http://localhost:8080/test3
{"code":400,"message":"num不能为空"}
Lawati http://localhost:8080/test3?num=0
{"code":400,"message":"/ by zero"}
Lawati http://localhost:8080 /test3?num=5
result:2
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pengecualian global SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!