Spring Boot第五彈,WEB開發初瞭解~

愛撒謊的男孩發表於2020-10-07

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

目錄

  • 前言
  • 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進階即可領取此冊。

相關文章