SpringBoot_03_Web开发

【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、@Email、@Min 等注解,Controller 参数加 @Valid 触发校验。校验失败抛出 MethodArgumentNotValidException,由全局异常处理器统一处理。


九、总结

功能 核心类/注解 要点
RESTful API @RestController 标准 CRUD 接口
统一响应 Result 封装 success() / error()
全局异常 @RestControllerAdvice @ExceptionHandler
拦截器 HandlerInterceptor addInterceptors
跨域 addCorsMappings 全局/局部配置
参数校验 @Valid + 注解 @NotBlank, @Email, @Min

💡 下一篇:《Spring Boot 数据层整合》,详解 MyBatis 整合、事务管理与 Actuator 监控。

相关推荐
辻弋2011 小时前
【无标题】
大数据·服务器·前端·搜索引擎·开源软件
weixin199701080161 小时前
《1688物流API接口边界:logistics.trace.get 与 freight.template.list 的隐藏约束》(附Python源码)
windows·python·list
FluxArt2 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
mhmh1232 小时前
Python 对象模型与数据模型:魔术方法、描述符与元类深度解析
开发语言·python
估值探索者2 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
搬砖的小码农_Sky3 小时前
AI Agent:Windows上Node.js安装后 npm -v报错
前端·npm·node.js·人机交互
Zhou1411363 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
FYKJ_20103 小时前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
计算机魔术师3 小时前
半年翻倍!OpenAI再融300亿,估值冲到1.4万亿
前端