持續原創輸出,點擊上方藍字關注我吧

目錄
-
前言 -
Spring Boot 版本 -
前提條件(必須注意) -
添加依賴 -
第一個接口開發 -
如何自定義tomcat的端口? -
如何自定義項目路徑?
-
-
JSON格式化 -
日期格式的設置 -
其他屬性的配置 -
如何在配置類配置?
-
-
總結
前言
今天是Spring Boot專欄的第五篇文章,相信大家看了前四篇文章對Spring Boot已經有了初步的了解,今天這篇文章就來介紹一下Spring Boot的重要功能WEB開發。
Spring Boot 版本
本文基於的Spring Boot的版本是2.3.4.RELEASE
。
前提條件(必須注意)
Spring Boot的WEB開發有自己的啟動器和自動配置,最好采用Spring Boot的一套配置,這里千萬不要在任何一個配置類上添加@EnableWebMvc
這個注解,具體原因會單獨一篇文章講述。
此篇文章所有的內容都是在沒有標注@EnableWebMvc
這個注解的前提下。
添加依賴
Spring Boot對web模塊有一個啟動器,只需要在pom.xml中引入即可,如下:
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
這個依賴看似只是引入了一個依賴,其實內部引入了Spring,Spring MVC的相關依賴,Spring Boot的啟動器就是這么神奇,后面的文章會介紹啟動器的原理和如何自定義啟動器。
第一個接口開發
假設這么一個需求,需要根據用戶的ID獲取用戶信息,我們應該如何寫接口呢?
其實和Spring MVC開發步驟一樣,寫一個controller,各種注解騷操作搞起,如下:
@RestController
@RequestMapping("/user") public class UserController { @GetMapping("/{id}") public Object getById(@PathVariable("id") String id){ return User.builder() .id(id) .name("不才陳某") .age(18) .birthday(new Date()) .build(); } }
這樣一個接口就已經完成了,啟動項目訪問http://localhost:8080/user/1
即可得到如下的結果:
{
"id": 1, "age": 18, "birthday": 1601454650860, "name": "不才陳某" }
如何自定義tomcat的端口?
Spring Boot其實默認內嵌了Tomcat,當然默認的端口號也是8080
,如果需要修改的話,只需要在配置文件中添加如下一行配置即可:
server.port=9090
如何自定義項目路徑?
在配置文件中添加如下配置即可:
server.servlet.context-path=/springboot01
以上的端口和項目路徑改了之后,只需要訪問http://localhost:9090/springboot01/user/1
即可。
JSON格式化
在前后端分離的項目中大部分的接口基本都是返回JSON字符串,因此對返回的JSON也是需要定制一下,比如日期的格式,NULL值是否返回等等內容。
Spring Boot默認是使用Jackson對返回結果進行處理,在引入WEB啟動器的時候會引入相關的依賴,如下圖:

同樣是引入了一個啟動器,則意味着我們既可以在配置文件中修改配置,也可以在配置類中重寫其中的配置。JackSon的自動配置類是JacksonAutoConfiguration
日期格式的設置
上面的例子中日期的返回結果其實是一個時間戳,那么我們需要返回格式為yyyy-MM-dd HH:mm:ss
。
可以在配置文件application.properties
中設置指定的格式,這屬於全局配置,如下:
spring.jackson.date-format= yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone= GMT+8
也可以在實體屬性中標注@JsonFormat
這個注解,屬於局部配置,會覆蓋全局配置,如下:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone = "GMT+8")
private Date birthday;
上述日期格式配置完成之后返回的就是指定格式的日期,如下:
{
"id": "1", "age": 18, "birthday": "2020-09-30 17:21", "name": "不才陳某" }
其他屬性的配置
Jackson還有很多的屬性可以配置,這里就不再一一介紹了,所有的配置前綴都是spring.jackson
。
如何在配置類配置?
前面說過在引入WEB模塊的時候還引入了JackSon的啟動器,這是個好東西,這也是Spring Boot的好處之一,自動配置類中所需的一些配置既可以在全局配置文件application.properties
中配置也可以在配置類中重新注入某個Bean而達到修改默認配置的效果。
在JackSon自動配置類JacksonAutoConfiguration
中有如下一段代碼:
@Bean
@Primary @ConditionalOnMissingBean ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { return builder.createXmlMapper(false).build(); }
這一段代碼可能初學者比較懵逼了,什么意思呢?別着急,@Bean
這個注解無非就是注入一個Bean到IOC容器中,@Primary
這個注解自不用說了,剩下的就是@ConditionalOnMissingBean
這個注解了,什么意思呢?
其實仔細研究過Spring Boot的源碼的朋友都知道,類似這種@Conditionalxxx
的注解還有很多,這里就不再深入講了,后期的文章會介紹。
@ConditionalOnMissingBean
這個注解的意思很簡單,就是當IOC容器中沒有指定Bean的時候才會注入,言下之意就是當容器中不存在ObjectMapper
這個Bean會使用這里生成的,類似於一種生效的條件。
言外之意就是只需要自定義一個ObjectMapper
然后注入到IOC容器中,那么這個自動配置類JacksonAutoConfiguration
中注入的將會失效,也就達到了覆蓋的作用了。
因此只需要定義一個配置類,注入ObjectMapper
即可,如下:
/** * 自定義jackson序列化與反序列規則,增加相關格式(全局配置) */ @Configuration public class JacksonConfig { @Bean @Primary public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { builder.locale(Locale.CHINA); builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault())); builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN); builder.modules(new CustomTimeModule()); ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); //遇到未知屬性的時候拋出異常,//為true 會拋出異常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 允許出現特殊字符和轉義符 objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 允許出現單引號 objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); objectMapper.registerModule(new CustomTimeModule()); return objectMapper; } }
上面只是個例子,關於ObjectMapper
中的一些內容感興趣的可以自己查查相關資料。
總結
這篇文章算是WEB開發的入門,介紹了如何定義接口,返回JSON如何定制等內容,如果覺得有所收獲點點關注在看分享一波!!!
作者的上個Mybatis專欄已經結束了,作者特意將全部文章整理成冊,回復關鍵詞Mybatis進階即可領取此冊。
