当前位置: 首页 > news >正文

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 绑定框架),你需要:

  1. 给类加上 @XmlRootElement
  2. 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_TIMESTAMPSfalse日期不以时间戳输出(更可读)
FAIL_ON_UNKNOWN_PROPERTIESfalseJSON 多字段不报错
DEFAULT_VIEW_INCLUSIONfalse避免视图注解带来的意外字段
🛠 如何自定义?

有多种方式:

1️⃣ 通过 application.yml 配置(最简单)
spring:jackson:serialization:indent-output: true   # 美化输出(缩进)default-property-inclusion: non_null  # 只序列化非 null 字段deserialization:fail-on-unknown-properties: true  # 遇到未知字段时报错

支持的配置前缀:

枚举类配置前缀
DeserializationFeaturespring.jackson.deserialization.xxx
SerializationFeaturespring.jackson.serialization.xxx
MapperFeaturespring.jackson.mapper.xxx
JsonInclude.Includespring.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 会替换掉默认的

方法二:使用 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默认路径
ThymeleafThymeleafViewResolverclasspath:/templates/
FreeMarkerFreeMarkerViewResolverclasspath:/templates/
MustacheMustacheViewResolverclasspath:/templates/
JSPInternalResourceViewResolver/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-xmlJAXB,并设置 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除非你想完全自己配置,否则不要用!

📚 学习建议

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

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

http://www.dtcms.com/a/565413.html

相关文章:

  • 蓝牙钥匙 第36次 汽车共享与分时租赁场景核心技术解析:从预约到多用户无缝切换
  • 教育行业网站建设方案虫部落是谁做的网站
  • Tesseract OCR 配置参数详解
  • 网站权重对应的等级5944免费空间上搭建网站
  • DevOps(devops/k8s/docker/Linux)学习笔记-4
  • 建立网站的程序武威市住房和建设局网站
  • 微服务面试题(14题)
  • 软件造价评估优秀案例:某大型能源企业数字化项目费用编制与后评价体系研究
  • mysql uuid()
  • 页面好看的蛋糕网站软件开发应该学什么专业
  • QtitanNavigation助力能源数字化转型:打造清晰可控的系统导航体验
  • 基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的植物病害知识问答系统(vue+flask+AI算法)
  • 数据库之多版本控制MVCC
  • CentOS7安装Docker和Mysql
  • PyTorch实战指南:从零搭建计算机视觉模型的完整流程
  • k8s-应用部署和组件及常用命令
  • 简述网站栏目管理网站信息员队伍建设方案
  • MySQL 8.0 迁移指南:破解 MariaDB 风险,实现数据库平稳过渡
  • 【分布式事务】Seata分布式解决方案
  • 关于网站建设的文章建设网站女装名字大全
  • 2025信阳市中等职业教育竞赛_网络安全赛项部分题解
  • 网站正在建设中a手机版wordpress 不登陆后台 数据库恢复
  • 八步开启以太坊智能合约开发:环境、编写、测试与部署
  • DXE流程
  • 如何通过网站做网上报名系统wordpress 图片水印插件
  • 聊聊Oracle数据库的向量能力
  • 网站中数据查询如何做php网站修改代码
  • 拆解扣子智能体 重塑生产力
  • 开商城网站宜昌企业网站建设
  • 【成都大学第八届玄武杯】锦家有什么