1. 程式人生 > >Spring Boot專案中如何定製HTTP訊息轉換器

Spring Boot專案中如何定製HTTP訊息轉換器

在構建RESTful資料服務過程中,我們定義了controller、repositories,並用一些註解修飾它們,但是到現在為止我們還沒執行過物件的轉換——將java實體物件轉換成HTTP的資料輸出流。

Spring Boot底層通過HttpMessageConverters和Jackson庫將Java實體類輸出為JSON格式。當有多個轉換器可用時,根據訊息物件型別和需要的內容型別選擇最適合的轉換器使用。

在SpringMVC原始碼剖析(五)-訊息轉換器HttpMessageConverter一文中,有一張圖可以很清楚得表示訊息轉換器的位置。

訊息轉換器的目標是:

  1. HTTP輸入請求格式向Java物件的轉換;
  2. Java物件向HTTP輸出請求的轉換。

有的訊息轉換器只支援多個數據型別,有的只支援多個輸出格式,還有的兩者兼備。

例如:MappingJackson2HttpMessageConverter可以將Java物件轉換為application/json,而ProtobufHttpMessageConverter僅支援com.google.protobuf.Message型別的輸入,但是可以輸出application/json、application/xml、text/plain和application/x-protobuf這麼多格式。

實踐

在專案中有三種辦法配置訊息轉換器,主要是從可定製性易用度兩個方面進行衡量。

  1. 在WebConfiguration類中加入@Bean定義
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
    return new ByteArrayHttpMessageConverter();
}
  1. 重寫(override)configureMessageConverters方法,擴充套件現有的訊息轉換器連結串列;
@Override
public 
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new ByteArrayHttpMessageConverter());
}
  1. 更多的控制,可以重寫extendMessageConverters方法,首先清空轉換器列表,再加入自定義的轉換器。
@Override
public 
void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.clear();
    converters.add(new ByteArrayHttpMessageConverter());
}

分析

Spring Boot提供了多種方法完成同樣的任務,選擇哪個取決於我們更側重便捷性還是更側重可定製性。

上述提到的三種方法各有什麼不同呢?

通過@Bean定義HttpMessageConverter是向專案中新增訊息轉換器最簡便的辦法,這類似於之前提到的新增Servlet Filters。如果Spring掃描到HttpMessageConverter型別的bean,就會將它自動新增到呼叫鏈中。推薦讓專案中的WebConfiguration繼承自WebMvcConfigurerAdapter。

通過重寫configureMessageConverters方法新增自定義的轉換器很方便,但有一個弱點:如果專案中存在多個WebMvcConfigurers的例項(我們自己定義的,或者Spring Boot預設提供的),不能確保重寫後的configureMessageConverters方法按照固定順序執行。

如果需要更精細的控制:清除其他訊息轉換器或者清楚重複的轉換器,可以通過重寫extendMessageConverters完成,仍然有這種可能:別的WebMvcConfigurer例項也可以重寫這個方法,但是這種機率非常小。

Spring Boot 1.x系列

  1. Spring Boot的自動配置、Command-line-Runner
  2. 瞭解Spring Boot的自動配置
  3. Spring Boot的@PropertySource註解在整合Redis中的使用

本號專注於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。

相關推薦

Spring Boot專案如何定製HTTP訊息轉換

在構建RESTful資料服務過程中,我們定義了controller、repositories,並用一些註解修飾它們,但是到現在為止我們還沒執行過物件的轉換——將java實體物件轉換成HTTP的資料輸出流。 Spring Boot底層通過HttpMessageConverters和Jackson庫將Java實體

三分鐘學會在spring boot 專案使用RabbitMq做訊息佇列

第一步:在spring boot專案中新增RabbitMq的maven依賴 <dependency> <groupId>org.springframework.boot</groupId>

Spring Boot專案如何定製PropertyEditors

本文首發於個人網站:Spring Boot專案中如何定製PropertyEditors 在Spring Boot: 定製HTTP訊息轉換器一文中我們學習瞭如何配置訊息轉換器用於HTTP請求和響應資料,實際上,在一次請求的完成過程中還發生了其他的轉換,我們這次關注將引數轉換成多種型別的物件,如:字串轉換成D

Spring Boot專案如何定製攔截

本文首發於個人網站:Spring Boot專案中如何定製攔截器 Servlet 過濾器屬於Servlet API,和Spring關係不大。除了使用過濾器包裝web請求,Spring MVC還提供HandlerInterceptor(攔截器)工具。根據文件,HandlerInterceptor的功能跟過濾器

spring boot專案使用@Slf4j註解

1、在pom.xml中引入lombok的依賴 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </depe

Spring Boot專案@Value取不到配置檔案的配置引數值

Spring Boot專案中@Value取不到配置檔案中的配置引數值 原取值方式如下所示: @Value("${authox.sql.url}") private static String url; @Value("${authox.sql.username}") private stati

spring boot 專案 獲取ApplicaitonContext

給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油 ApplicationContextAware 這個介面物件就是我們今天的主角,其實以實現ApplicationContextAware介面的方式獲取ApplicationContext物件例項並不是SpringBoot特有的功能

spring boot 專案hanlp的配置(可增加自定義詞典)

pom.xml檔案中增加: com.hankcs hanlp system ${project.basedir}/src/main/resources/lib/hanlp-1.5.2.jar 字典和模型檔案在專案中的位置,其中包括自定義詞典: data資料夾在專案中的位置:

spring boot專案使用 RedisTemplate/StringRedisTemplate 學習經歷

專案開發時遇到需要去防止兩個服務同時跑一個功能時而導致公用的一個表出現資料錯誤的問題,領導說了幾個解決方案redis是唯一一個聽過的就趕緊學了一下,因為並未去很好的瀏覽專案結構剛開始繞了很大一圈,自己建立連線池配置檔案引pom啥的,結果發現都是已經搭好的,但也對redis有了更深的認識,先貼下程式碼 app

spring boot 專案使用thymeleaf模板,將後臺資料傳遞給前臺介面。

1、將後臺資料傳遞給前臺有很多種方式,可以將後臺要傳遞的資料轉換成json格式,去傳遞給前臺,也可以通過model形式去傳遞出去,這篇部落格主要是使用thymeleaf模板,將後臺資料傳遞給前臺。 2、首先要在spring boot 專案中新增如下依賴:

spring boot專案 mybatis-config.xml的配置

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.o

spring boot 專案元件和各種註解

spring boot 專案分析 最近一直在做專案,都是有一塊補一塊,也沒系統的整理下spring boot個元件的功能和使用方式,就大致總結下,也是為了方便以後快速構建專案 (1) web 容器 spring-boot-starter-web 預設tomcat 可以去除tomcat (2)

技術文章 | spring boot專案使用jpa的一個未解之謎

 本文來源於阿里雲-雲棲社群,原文點選這裡。 公司最近主要的工作就是把之前的一個專案進行幾乎全面的重構,之所以說幾乎全面,是因為除開業務邏輯外全部換血: 框架由spring+struts2+mybatis改為spring boot+jpa資料庫由sybase+h2改

Spring Boot 專案引入websocket後,執行Junit測試報錯

1、報錯資訊如下 java.lang.IllegalStateException: Failed to load ApplicationContext     at org.springframework.test.context.cache.Default

spring boot專案加入 JWT

將JWT放到專案中作為一個引數被掉用發起者傳過來作為介面呼叫的口令 <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> <dependency> <groupId>com

【JAVA-OSS】如何在spring-boot專案使用oss上傳下載檔案

準備工作: 1.申請oss 你會得到 endpoint,accessKeyId,bucketName,accessKeySecret 2.引入oss maven dependency : com.aliyun.oss:aliyun-sdk-oss:jar:2.5.0 3.

spring boot專案處理Schedule定時任務

預設,springboot已經支援了定時任務Schedule模組,所以一般情況已經完全能夠滿足我們的實際需求,一般來說,沒有必要在加入其他類似於:quartz另外,在這裡提一個實際專案中,關於定時任務的架構上的一些考慮:一般來說,實際專案中,為了提高服務的響應能力,我們一般會通過負載均衡的方式,或者反向代理多

spring boot專案使用spring-boot-devtools模組進行程式碼熱部署,避免重新啟動web專案

devtools模組,是為開發者服務的一個模組。主要的功能就是程式碼修改後一般在5秒之內就會自動重新載入至伺服器,相當於restart成功。 spring-boot提供的重新啟動技術使用兩個類載入器,一個類載入器用來載入那些不變的類(如第三方jar包提供的類),另外一個用來

spring boot專案應用swagger2

1.       在pom.xml中新增<dependency> <groupId>io.springfox</groupId> <artifactId&g

新建一個maven spring boot專案遇到的問題

package config; import com.alibaba.druid.pool.DruidDataSource; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSessionFactory; import