下面我将为你详细讲解“详解SpringBoot中的统一异常处理”的完整攻略。
什么是SpringBoot中的统一异常处理
在SpringBoot中,我们经常需要对抛出的异常进行统一处理。如果我们每个地方都去捕捉异常,并进行相应处理,那么代码量会非常大。此时,我们可以使用SpringBoot中的统一异常处理,将所有异常集中处理,大大减少了代码量,也方便了我们对异常的管理。
怎么使用SpringBoot中的统一异常处理
1.引入异常处理的依赖
在pom.xml中添加spring-boot-starter-web
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.定义一个统一异常处理类
在SpringBoot中,我们可以通过@ControllerAdvice注解定义一个统一异常处理类。
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 参数校验异常处理方法
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
return Result.failure(e.getBindingResult().getFieldError().getDefaultMessage());
}
/**
* 全局异常处理方法
*/
@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result handleException(Exception e) {
return Result.failure("系统出现错误,请联系管理员!");
}
}
在上述代码中,我们使用了@ExceptionHandler注解对两类异常进行了处理。
- MethodArgumentNotValidException:参数校验异常处理方法,我们在该方法中获取到校验失败的信息,并返回给前端。
- Exception:全局异常处理方法,我们在该方法中返回了一个默认的错误信息。
3.定义一个返回统一数据格式的对象
在进行异常处理时,我们一般需要返回一个统一的数据格式。为了方便处理,我们可以定义一个Result对象,并在异常处理方法中返回该对象。
public class Result {
private int code;
private String message;
private Object data;
public Result(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public static Result success(Object data) {
return new Result(200, "success", data);
}
public static Result failure(String message) {
return new Result(500, message, null);
}
// getters and setters
}
在上述代码中,我们定义了一个Result对象,该对象包含了code、message和data三个属性,并提供了两个静态方法success和failure。通过success方法,我们可以创建一个成功的Result对象,并将数据设置到data属性中;通过failure方法,我们可以创建一个失败的Result对象,并将错误信息设置到message属性中。
4.在Controller中抛出异常
现在,我们已经定义好了统一异常处理类和统一数据格式,接下来我们需要在Controller中抛出异常,然后交由统一异常处理类去处理。示例代码如下:
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public Result login(@RequestBody User user) {
User result = userService.login(user);
if(result == null) {
throw new RuntimeException("用户名或密码错误!");
}
return Result.success(result);
}
}
在上述代码中,我们在login方法中抛出了一个RuntimeException异常,并设置了异常信息。
5.测试异常处理
现在,我们已经完成了SpringBoot中的统一异常处理的配置,接下来我们需要进行测试。我们可以在Controller中故意抛出异常,然后查看返回数据是否符合我们的预期。下面是一个测试示例:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void testLogin() throws Exception {
JSONObject json = new JSONObject();
json.put("username", "admin");
json.put("password", "123456");
String content = json.toJSONString();
mvc.perform(MockMvcRequestBuilders.post("/api/user/login")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(content))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(500))
.andExpect(jsonPath("$.message").value("用户名或密码错误!"));
}
}
在上述示例中,我们使用了MockMvc进行测试,模拟了一次/login接口的请求,并故意使用错误的用户名和密码。如果返回的数据为500状态码,并且message为“用户名或密码错误!”,则意味着我们的异常处理已经生效。
示例说明
上述示例中,我们展示了如何使用SpringBoot中的统一异常处理,实现了对全局异常和参数校验异常的处理。我们定义了一个统一的数据格式Result,并在Controller中抛出异常。当异常发生时,统一异常处理类会捕获异常,并将处理结果返回给前端。在测试中,我们模拟了一个非法请求,测试了我们的异常处理流程是否生效,结果也符合我们的预期。
另外一个示例是,在Spring Boot应用中使用了JdbcTemplate进行数据库操作时,当操作失败时,需要对抛出的SQLException进行处理。我们也可以在GlobalExceptionHandler中定义一个SQLException处理方法,来捕获SQLException,并返回一个统一的数据格式Result。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot中的统一异常处理 - Python技术站