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 监控。

相关推荐
moshuying1 分钟前
DeepSeek开源生产级推理框架DeepInfer:单集群一天处理155万亿token,这意味着什么?
前端
AI 编程助手GPT4 分钟前
GPT 脚本别只发一个文件:用 uv 把依赖和锁一起交付
人工智能·python·gpt·uv·依赖管理
Patrick在香港24 分钟前
第 16,216 次连接之后,它不干了
python·网络编程·socket·tcp·连接池
我命由我1234528 分钟前
Python 开发 - Python 虚拟环境
运维·开发语言·后端·python·http·https·java-ee
云和数据.ChenGuang42 分钟前
LLM大模型对接本地Ollama部署模型
开发语言·人工智能·python·langchain
子兮曰1 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php
jerrywus1 小时前
给 Pi 装上生图插件:从登录报错到画出一只 200×200 的猫
前端·agent·claude
陈随易1 小时前
搞钱点子之生态鱼缸
前端·后端·程序员
PBitW1 小时前
从空目录到上线:我全程用 TRAE 做了一款微信小游戏合集(含一次完整架构重构)
前端·trae
不爱学英文的码字机器1 小时前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft