Spring Boot MVC 实战指南
🌟 总体理解
Spring Boot 对 Spring MVC 做了大量的自动配置(auto-configuration),让你无需手动配置就能快速搭建 Web 应用。本节主要回答开发者在使用 Spring Boot + Spring MVC 时最常遇到的问题,比如:
- 如何返回 JSON?
 - 如何返回 XML?
 - 如何自定义 Jackson 的行为?
 - 文件上传怎么处理?
 - 如何关闭默认 MVC 配置?
 
我们来逐一解读。
🔹 10.4.1 写一个 JSON REST 服务
核心意思:
只要你的项目中引入了 jackson(通常是通过 spring-boot-starter-web 自动引入),并且控制器方法返回的是 POJO 对象,那么 Spring Boot 会自动把对象序列化成 JSON。
@RestController
public class MyController {@RequestMapping("/thing")public MyThing thing() {return new MyThing();}
}
👉 访问 http://localhost:8080/thing 就会返回 MyThing 对象的 JSON 表示。
⚠️ 注意:
- 如果你在浏览器中访问,有时看到的是 XML,是因为浏览器默认发送的 
Accept请求头优先接受 XML。 - 解决方法:用 Postman、curl 或设置请求头 
Accept: application/json。 
✅ 结论:Spring Boot + Jackson = 自动 JSON 输出,开箱即用。
🔹 10.4.2 写一个 XML REST 服务
目标:让接口返回 XML 而不是 JSON。
有两种方式:
✅ 方式一:使用 Jackson 的 XML 支持(推荐)
添加依赖:
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
然后 Spring Boot 会自动使用 Jackson2XmlConverter 来处理 XML 序列化。
原来的
@RestController不用改,只要客户端请求头是Accept: text/xml,就会返回 XML。
✅ 方式二:使用 JAXB(较老的方式)
如果没用 Jackson XML,但用了 JAXB(Java 的 XML 绑定框架),你需要:
- 给类加上 
@XmlRootElement - Java 9+ 需要手动引入 JAXB 依赖:
 
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId>
</dependency>
然后也能返回 XML。
📌 小贴士:发送 Accept: text/xml 才能触发 XML 返回。
🔹 10.4.3 自定义 Jackson ObjectMapper
ObjectMapper 是 Jackson 的核心类,负责对象 ↔ JSON 的转换。
Spring Boot 已经为你配置了一个默认的 ObjectMapper,并设置了几个常用选项:
| 特性 | 默认值 | 说明 | 
|---|---|---|
WRITE_DATES_AS_TIMESTAMPS | false | 日期不以时间戳输出(更可读) | 
FAIL_ON_UNKNOWN_PROPERTIES | false | JSON 多字段不报错 | 
DEFAULT_VIEW_INCLUSION | false | 避免视图注解带来的意外字段 | 
🛠 如何自定义?
有多种方式:
1️⃣ 通过 application.yml 配置(最简单)
spring:jackson:serialization:indent-output: true   # 美化输出(缩进)default-property-inclusion: non_null  # 只序列化非 null 字段deserialization:fail-on-unknown-properties: true  # 遇到未知字段时报错
支持的配置前缀:
| 枚举类 | 配置前缀 | 
|---|---|
DeserializationFeature | spring.jackson.deserialization.xxx | 
SerializationFeature | spring.jackson.serialization.xxx | 
MapperFeature | spring.jackson.mapper.xxx | 
JsonInclude.Include | spring.jackson.default-property-inclusion | 
✅ 支持驼峰命名自动转换(如 indent_output → INDENT_OUTPUT)
2️⃣ 使用 Jackson2ObjectMapperBuilderCustomizer
你可以定义一个 Bean 来定制 ObjectMapper 的构建过程:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {return builder -> builder.indentOutput(true);
}
3️⃣ 注册自定义的 Module
比如你想支持 Java 8 时间类型(LocalDateTime),可以注册 JavaTimeModule:
@Bean
public JavaTimeModule javaTimeModule() {return new JavaTimeModule();
}
Spring Boot 会自动把它注册到 ObjectMapper 中。
4️⃣ 完全替换 ObjectMapper
如果你自己定义一个 @Bean @Primary ObjectMapper,就会完全取代 Spring Boot 的默认配置(慎用!)。
🔹 10.4.4 自定义 @ResponseBody 的渲染方式
@ResponseBody 是怎么变成 JSON/XML 的?靠的是 HttpMessageConverter。
Spring Boot 默认注册了一些转换器,比如:
MappingJackson2HttpMessageConverter→ 处理 JSONMappingJackson2XmlHttpMessageConverter→ 处理 XML(如果有依赖)
🛠 如何扩展或替换?
方法一:添加新的 HttpMessageConverter Bean
@Bean
public HttpMessageConverter<MyCustomType> myConverter() {return new MyCustomHttpMessageConverter();
}
如果这个类型原本就有默认转换器(如 Jackson),你的 Bean 会替换掉默认的。
方法二:使用 WebMvcConfigurer
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MyCustomConverter());}
}
⚠️ 注意:不要加 @EnableWebMvc,否则会关闭 Spring Boot 的自动配置。
方法三:使用 HttpMessageConverters 工具类
Spring Boot 提供了一个便利的 Bean:
@Autowired
private HttpMessageConverters converters; // 包含默认 + 自定义的转换器
可用于构建 RestTemplate 等。
🔹 10.4.5 处理文件上传(Multipart File Uploads)
Spring Boot 使用 Servlet 3 的原生 Part API 来支持文件上传。
默认限制:
- 单个文件最大:1MB
 - 整个请求最大:10MB
 
可通过 application.yml 修改:
spring:servlet:multipart:max-file-size: 10MBmax-request-size: 50MBlocation: /tmpenabled: true
控制器中使用:
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {// 处理文件return "success";
}
✅ 建议使用容器(Tomcat 等)内置的 multipart 支持,不要引入 commons-fileupload。
🔹 10.4.6 关闭或修改 DispatcherServlet 的路径
默认情况下,DispatcherServlet 映射到 /,即所有请求都经过它。
修改映射路径:
spring:mvc:servlet:path: /api
这样只有 /api/** 的请求才会进入 Spring MVC。
注册其他 Servlet:
@Bean
public ServletRegistrationBean<MyOtherServlet> myServlet() {return new ServletRegistrationBean<>(new MyOtherServlet(), "/other/*");
}
这些 Servlet 可以和 DispatcherServlet 并存。
🔹 10.4.7 关闭默认 MVC 配置
如果你在配置类上加了:
@Configuration
@EnableWebMvc
public class MyWebConfig {// ...
}
⚠️ 这会导致 Spring Boot 的 MVC 自动配置全部失效!
你必须自己手动配置所有内容(视图解析器、消息转换器等)。
📌 所以:除非你真的需要完全控制,否则不要加 @EnableWebMvc。
🔹 10.4.8 自定义 ViewResolvers(用于页面渲染)
ViewResolver 是用来把控制器返回的视图名(如 "home")映射到实际模板(如 home.html)的组件。
Spring Boot 根据你使用的模板引擎自动配置相应的 ViewResolver:
| 模板引擎 | ViewResolver | 默认路径 | 
|---|---|---|
| Thymeleaf | ThymeleafViewResolver | classpath:/templates/ | 
| FreeMarker | FreeMarkerViewResolver | classpath:/templates/ | 
| Mustache | MustacheViewResolver | classpath:/templates/ | 
| JSP | InternalResourceViewResolver | /WEB-INF/ | 
常见配置项:
spring:mvc:view:prefix: /WEB-INF/jsp/suffix: .jspthymeleaf:prefix: classpath:/templates/suffix: .html
特殊的 ContentNegotiatingViewResolver
如果上下文中存在多个 View Bean,Spring Boot 会自动注册一个 ContentNegotiatingViewResolver,它根据客户端的 Accept 头选择返回 HTML、JSON 还是 XML。
你可以通过定义名为 viewResolver 的 Bean 来禁用它。
✅ 总结:关键知识点归纳
| 问题 | 解决方案 | 
|---|---|
| 如何返回 JSON? | 加 jackson,返回 POJO 即可 | 
| 如何返回 XML? | 加 jackson-dataformat-xml 或 JAXB,并设置 Accept: text/xml | 
| 如何美化 JSON 输出? | spring.jackson.serialization.indent-output=true | 
| 如何忽略未知 JSON 字段? | spring.jackson.deserialization.fail-on-unknown-properties=false | 
| 如何只输出非 null 字段? | spring.jackson.default-property-inclusion=non_null | 
| 如何上传文件? | 配置 multipart 限制,用 MultipartFile 接收 | 
| 如何修改 DispatcherServlet 路径? | spring.mvc.servlet.path=/api | 
| 如何自定义消息转换器? | 添加 HttpMessageConverter Bean 或实现 WebMvcConfigurer | 
| 如何使用 Thymeleaf? | 加依赖,模板放 templates/ 目录 | 
什么时候不要用 @EnableWebMvc? | 除非你想完全自己配置,否则不要用! | 
📚 学习建议
- 先学会用默认配置:Spring Boot 的自动配置已经很强大。
 - 再学如何定制:通过 
application.yml或@Bean修改行为。 - 最后才考虑替换或关闭:如 
@EnableWebMvc是“高级玩法”,慎用。 
如果你有具体的场景(比如“我想让所有接口默认返回 XML”或“如何让日期格式统一为 yyyy-MM-dd”),欢迎继续提问,我可以给出具体代码示例。
