【Spring Boot】Web 开发:RESTful API、拦截器与全局异常处理
🔑 关键词:Java、Spring Boot、Web开发、RESTful、拦截器、全局异常、跨域CORS
一、Spring Boot Web 开发基础
引入 spring-boot-starter-web 后自动包含:Spring MVC、内嵌 Tomcat、Jackson。
java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> list() { return userService.findAll(); }
@GetMapping("/{id}")
public User getById(@PathVariable Long id) { return userService.findById(id); }
@PostMapping
public User create(@RequestBody User user) { return userService.save(user); }
@PutMapping("/{id}")
public User update(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
return userService.update(user);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { userService.deleteById(id); }
}
二、统一响应格式
java
public class Result<T> {
private int code;
private String message;
private T data;
private Result(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public static <T> Result<T> success(T data) {
return new Result<>(200, "success", data);
}
public static <T> Result<T> error(int code, String message) {
return new Result<>(code, message, null);
}
}
使用:
java
@GetMapping("/{id}")
public Result<User> getById(@PathVariable Long id) {
return Result.success(userService.findById(id));
// 响应:{"code":200,"message":"success","data":{...}}
}
三、全局异常处理
3.1 @RestControllerAdvice
java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public Result<?> handleBusinessException(BusinessException e) {
return Result.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<?> handleValidException(MethodArgumentNotValidException e) {
String msg = e.getBindingResult().getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining("; "));
return Result.error(400, msg);
}
@ExceptionHandler(Exception.class)
public Result<?> handleException(Exception e) {
e.printStackTrace();
return Result.error(500, "服务器内部错误");
}
}
3.2 自定义业务异常
java
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() { return code; }
}
// 使用
public User findById(Long id) {
User user = userMapper.selectById(id);
if (user == null) {
throw new BusinessException(404, "用户不存在");
}
return user;
}
四、拦截器
java
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) {
response.setStatus(401);
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":401,\"message\":\"未登录\"}");
return false;
}
return true;
}
}
注册:
java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login", "/api/register");
}
}
五、跨域处理(CORS)
5.1 全局配置(推荐)
java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
5.2 局部配置
java
@RestController
@CrossOrigin(origins = "http://localhost:3000")
public class UserController { }
六、参数校验
引入依赖 spring-boot-starter-validation,在 DTO 上使用校验注解:
java
public class UserDTO {
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 20, message = "用户名长度2-20")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 1, message = "年龄最小为1")
@Max(value = 150, message = "年龄最大为150")
private Integer age;
}
// Controller 中加 @Valid 触发校验
@PostMapping
public Result<User> create(@RequestBody @Valid UserDTO dto) {
return Result.success(userService.save(dto));
}
// 校验失败自动抛出 MethodArgumentNotValidException,由全局异常处理器处理
七、WebMvcConfigurer 常用方法汇总
java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override public void addInterceptors(InterceptorRegistry registry) { } // 拦截器
@Override public void addCorsMappings(CorsRegistry registry) { } // 跨域
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } // 静态资源
@Override public void addViewControllers(ViewControllerRegistry registry) { } // 视图控制器
@Override public void addFormatters(FormatterRegistry registry) { } // 日期格式化
}
八、面试高频问题
Q1:Spring Boot 中如何实现跨域?
答 :实现
WebMvcConfigurer,重写addCorsMappings方法。可以全局配置(推荐)或使用@CrossOrigin注解局部配置。核心设置allowedOriginPatterns、allowedMethods、allowedHeaders。
Q2:@RestControllerAdvice 和 @ControllerAdvice 的区别?
答 :
@ControllerAdvice需配合@ResponseBody才能返回 JSON;@RestControllerAdvice=@ControllerAdvice+@ResponseBody,直接返回 JSON。Spring Boot 项目推荐用@RestControllerAdvice。
Q3:Spring Boot 的参数校验怎么用?
答 :引入
spring-boot-starter-validation,DTO 字段使用@NotBlank、@Min等注解,Controller 参数加@Valid触发校验。校验失败抛出MethodArgumentNotValidException,由全局异常处理器统一处理。
九、总结
| 功能 | 核心类/注解 | 要点 |
|---|---|---|
| RESTful API | @RestController | 标准 CRUD 接口 |
| 统一响应 | Result 封装 | success() / error() |
| 全局异常 | @RestControllerAdvice | @ExceptionHandler |
| 拦截器 | HandlerInterceptor | addInterceptors |
| 跨域 | addCorsMappings | 全局/局部配置 |
| 参数校验 | @Valid + 注解 | @NotBlank, @Email, @Min |
💡 下一篇:《Spring Boot 数据层整合》,详解 MyBatis 整合、事务管理与 Actuator 监控。