最省事的依赖是spring-boot-starter-web,它自动引入tomcat和webmvc;必须有@RestController(或@Controller+@ResponseBody)、@GetMapping、带@SpringBootApplication的顶层主类;端口配置用server.port=8081(纯数字);中文乱码需设server.servlet.encoding.charset=UTF-8和force=true。

Spring Boot项目初始化选哪个依赖最省事
直接用 spring-boot-starter-web 就够了,别加 spring-boot-starter-tomcat 或 spring-webmvc 这类底层依赖——它们已被 starter 自动拉入,手动加反而可能引发版本冲突。
常见错误现象:IDE 提示 “No dispatcher servlet found”,其实是没加 spring-boot-starter-web;或者启动报 ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet,说明依赖不完整。
- 新建项目时,在 start.spring.io 勾选
Spring Web即可(对应spring-boot-starter-web) - 如果用 Maven,确认
pom.xml里有且仅有一处spring-boot-starter-web,scope 保持默认(compile) - 不用手动配
@EnableWebMvc—— Spring Boot 默认已启用,加了反而会覆盖自动配置
写一个能跑通的 @RestController 必须满足什么条件
三个硬性条件缺一不可:类上必须有 @RestController(或 @Controller + 方法上 @ResponseBody),方法要有 @GetMapping(或其它 HTTP 动词注解),且项目得有主启动类并带 @SpringBootApplication。
常见错误现象:“访问 /hello 返回 404”,大概率是主类没放在包顶层,导致组件扫描不到 Controller;或者用了 @Controller 但忘了加 @ResponseBody,结果返回的是视图名而非 JSON 字符串。
- 主启动类(如
Application.java)必须在“最外层包”下,比如包名是com.example.demo,那它就得在com.example.demo包里,不能在com.example.demo.controller -
@RestController类默认路径前缀为空,想统一加前缀就用@RequestMapping("/api")在类上 - 方法返回值如果是 String,且没加
@ResponseBody,Spring Boot 会尝试走视图解析——此时若没配模板引擎,直接 500
最小可行示例:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
启动后端口被占或想换端口怎么改
改 application.properties 里的 server.port 最直接,但要注意:如果值是字符串(比如写成 server.port="8081"),Spring Boot 会静默失败,端口还是 8080。
使用场景:本地开发时和 Node.js 或其他 Java 进程冲突;CI/CD 环境需固定端口;测试时想快速起多个实例。
- 正确写法:
server.port=8081(纯数字,无引号、无空格) - 临时覆盖:启动命令加参数
--server.port=8082,比配置文件优先级高 - 想随机端口?写
server.port=0,启动后看日志里打印的实际端口(常用于集成测试) - Windows 下如果提示 “Address already in use”,先用
netstat -ano | findstr :8080找 PID,再taskkill /PID xxx /F
为什么返回中文变问号或乱码
根本原因是响应头没设对 Content-Type 的字符集,Spring Boot 默认用 text/plain;charset=ISO-8859-1,而中文需要 UTF-8。
性能影响几乎为零,但兼容性差——浏览器、Postman、curl 都可能显示异常;移动端尤其敏感。
- 最稳妥方式:在
application.properties加两行:server.servlet.encoding.charset=UTF-8server.servlet.encoding.force=true - 如果只针对 JSON 接口,确保返回对象是 POJO(不是
String),Spring Boot 会自动用application/json;charset=UTF-8,无需额外配置 - 千万别在
@GetMapping上硬写produces = "text/plain;charset=UTF-8"——这会覆盖默认的 JSON 自动推导
真正卡住人的地方往往不是语法,而是包结构位置、配置项的格式细节、以及 Spring Boot 那些“默认做了但你不知道”的隐式行为。多看启动日志里有没有 “Mapped URL path” 这行,比反复改代码更省时间。

















