Spring Boot MVC 实战指南

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,是因为浏览器默认发送的 A***ept 请求头优先接受 XML。
  • 解决方法:用 Postman、curl 或设置请求头 A***ept: application/json

结论:Spring Boot + Jackson = 自动 JSON 输出,开箱即用。


🔹 10.4.2 写一个 XML REST 服务

目标:让接口返回 XML 而不是 JSON。

有两种方式:

✅ 方式一:使用 Jackson 的 XML 支持(推荐)

添加依赖:

<dependency>
    <groupId>***.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

然后 Spring Boot 会自动使用 Jackson2XmlConverter 来处理 XML 序列化。

原来的 @RestController 不用改,只要客户端请求头是 A***ept: text/xml,就会返回 XML。

✅ 方式二:使用 JAXB(较老的方式)

如果没用 Jackson XML,但用了 JAXB(Java 的 XML 绑定框架),你需要:

  1. 给类加上 @XmlRootElement
  2. Java 9+ 需要手动引入 JAXB 依赖:
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

然后也能返回 XML。

📌 小贴士:发送 A***ept: 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_outputINDENT_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 → 处理 JSON
  • MappingJackson2XmlHttpMessageConverter → 处理 XML(如果有依赖)
🛠 如何扩展或替换?
方法一:添加新的 HttpMessageConverter Bean
@Bean
public HttpMessageConverter<MyCustomType> myConverter() {
    return new MyCustomHttpMessageConverter();
}

如果这个类型原本就有默认转换器(如 Jackson),你的 Bean 会替换掉默认的

方法二:使用 WebMv***onfigurer
@Configuration
public class WebConfig implements WebMv***onfigurer {
    @Override
    public 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: 10MB
      max-request-size: 50MB
      location: /tmp
      enabled: true
控制器中使用:
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    // 处理文件
    return "su***ess";
}

✅ 建议使用容器(Tomcat 等)内置的 multipart 支持,不要引入 ***mons-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: .jsp
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
特殊的 ContentNegotiatingViewResolver

如果上下文中存在多个 View Bean,Spring Boot 会自动注册一个 ContentNegotiatingViewResolver,它根据客户端的 A***ept 头选择返回 HTML、JSON 还是 XML。

你可以通过定义名为 viewResolver 的 Bean 来禁用它。


✅ 总结:关键知识点归纳

问题 解决方案
如何返回 JSON? jackson,返回 POJO 即可
如何返回 XML? jackson-dataformat-xmlJAXB,并设置 A***ept: 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 或实现 WebMv***onfigurer
如何使用 Thymeleaf? 加依赖,模板放 templates/ 目录
什么时候不要用 @EnableWebMvc 除非你想完全自己配置,否则不要用!

📚 学习建议

  1. 先学会用默认配置:Spring Boot 的自动配置已经很强大。
  2. 再学如何定制:通过 application.yml@Bean 修改行为。
  3. 最后才考虑替换或关闭:如 @EnableWebMvc 是“高级玩法”,慎用。

如果你有具体的场景(比如“我想让所有接口默认返回 XML”或“如何让日期格式统一为 yyyy-MM-dd”),欢迎继续提问,我可以给出具体代码示例。

转载请说明出处内容投诉
CSS教程网 » Spring Boot MVC 实战指南

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买