最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC自定義消息轉(zhuǎn)換器的使用其實(shí)很簡(jiǎn)單

 更新時(shí)間:2024年07月08日 10:01:27   作者:kusedexingfu  
這篇文章主要介紹了SpringMVC自定義消息轉(zhuǎn)換器的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在我們的日常開發(fā)中,作為服務(wù)端,接收的數(shù)據(jù)是加密的字符串。我們可能會(huì)在Controller中獲取到加密的字符串,然后手動(dòng)解密,類似于如下做法(用base64做樣例):

@PostMapping
public void base64Post(String base64Param) throws UnsupportedEncodingException {
    String jsonStr = new String(Base64.getDecoder().decode(base64Param), "UTF-8");
}

其實(shí)通過SpringMVC的消息轉(zhuǎn)換器HttpMessageConverter可以統(tǒng)一的處理這種問題。

下面就來介紹下實(shí)現(xiàn)方式吧。

什么是消息轉(zhuǎn)換器

在SpringMVC中,可以使用@RequestBody和@ResponseBody兩個(gè)注解,分別完成請(qǐng)求報(bào)文到對(duì)象和對(duì)象到響應(yīng)報(bào)文的轉(zhuǎn)換,這種靈活的消息轉(zhuǎn)換機(jī)制就是利用HttpMessageConverter來實(shí)現(xiàn)的,Spring內(nèi)置了很多HttpMessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等,下面我們來自定義自己的消息轉(zhuǎn)換器來滿足上面的需求

自定義消息轉(zhuǎn)換器

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Base64;

/**
 * 針對(duì)Object的base64消息處理器
 */
public class Base64ObjMessageConverter extends AbstractHttpMessageConverter<Object> {

    public Base64ObjMessageConverter() {
        // 新建一個(gè)我們自定義的媒體類型application/base64obj
        super(new MediaType("application", "base64obj", Charset.forName("UTF-8")));
    }


    @Override
    protected boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        String source = new String(Base64.getDecoder().decode(StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"))), "UTF-8");
        return new ObjectMapper().readValue(source, clazz);
    }

    @Override
    protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        byte[] encode = Base64.getEncoder().encode(new ObjectMapper().writeValueAsString(obj).getBytes());
        outputMessage.getBody().write(encode);
    }
}

如上,我們繼承了泛型類AbstractHttpMessageConverter,并重寫了它的幾個(gè)方法。

  • supports:設(shè)置處理哪些類。
  • readInternal:處理輸入內(nèi)容,即處理請(qǐng)求值。
  • writeInternal:處理輸出內(nèi)容,即處理返回值。

構(gòu)造方法定義了要處理的MediaType,這里我定義的是application/base64obj;charset=utf-8,接下來在Controller中也要用到這個(gè)MediaType

上面我自定義的消息轉(zhuǎn)換器處理的是Object類型,你也可以指定泛型為特定的類型,只處理該種類型的數(shù)據(jù)。

將自定義的消息轉(zhuǎn)換器加入到springmvc容器中

這里采用配置類的形式

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class MessageConverterConfig implements WebMvcConfigurer {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(base64ObjMessageConverter());
    }

    @Bean
    public Base64ObjMessageConverter base64ObjMessageConverter() {
        return new Base64ObjMessageConverter();
    }
}

Controller代碼

@PostMapping(value = "base64obj",  consumes = "application/base64obj;charset=utf-8",produces = "application/base64obj;charset=utf-8")
    public User base64obj(@RequestBody User user) {
        System.out.println(user);
        return user;
    }

我們可以通過設(shè)置consumes和produces來讓springmvc采用不同的消息轉(zhuǎn)換器處理我們的請(qǐng)求。

我們的測(cè)試代碼設(shè)置的@PostMapping的屬性consumers和produces都為我們的自定義的消息處理器要處理的類型application/base64obj;charset=utf-8。

即請(qǐng)求和返回都需要經(jīng)過自定義消息處理器Base64ObjMessageConverter的處理。

注意:

  • 我們可以將consumers和produces設(shè)置為不同的MediaType來讓不同的消息轉(zhuǎn)換器來處理,但是開發(fā)中一般不會(huì)這么做。
  • 比如輸入的格式是XML,返回的格式確實(shí)JSON,這樣做是很逆天的。
  • consumers和produces一般都會(huì)采用相同的MediaType。

PostMan請(qǐng)求測(cè)試

我們將json字符串 {"id":1,"name":"name","sex":"男"} 轉(zhuǎn)為base64字符串:eyJpZCI6MSwibmFtZSI6Im5hbWUiLCJzZXgiOiLnlLcifQ==

用postma請(qǐng)求,設(shè)置Content-Type為我們自定義的application/base64obj;charset=utf-8

設(shè)置請(qǐng)求體,發(fā)送請(qǐng)求,結(jié)果能響應(yīng)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java長(zhǎng)度不足左位補(bǔ)0的3種實(shí)現(xiàn)方法

    Java長(zhǎng)度不足左位補(bǔ)0的3種實(shí)現(xiàn)方法

    這篇文章主要介紹了Java長(zhǎng)度不足左位補(bǔ)0的3種實(shí)現(xiàn)方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java集合——Java中的equals和hashCode方法詳解

    java集合——Java中的equals和hashCode方法詳解

    本篇文章詳細(xì)介紹了Java中的equals和hashCode方法詳解,Object 類是所有類的父類,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-10-10
  • java中創(chuàng)建寫入文件的6種方式詳解與源碼實(shí)例

    java中創(chuàng)建寫入文件的6種方式詳解與源碼實(shí)例

    這篇文章主要介紹了java中創(chuàng)建寫入文件的6種方式詳解與源碼實(shí)例,Files.newBufferedWriter(Java 8),Files.write(Java 7 推薦),PrintWriter,File.createNewFile,FileOutputStream.write(byte[] b) 管道流,需要的朋友可以參考下
    2022-12-12
  • SpringBoot項(xiàng)目屬性配置(application.properties、yml和yaml)

    SpringBoot項(xiàng)目屬性配置(application.properties、yml和yaml)

    SpringBoot支持多種配置文件格式,包括application.properties、yml和yaml,application.properties是鍵值對(duì)結(jié)構(gòu),常用于簡(jiǎn)單配置,如設(shè)置服務(wù)器端口,yml和yaml文件格式相同,使用縮進(jìn)表示層級(jí),適合復(fù)雜配置,下面就來詳細(xì)的介紹一下
    2025-08-08
  • IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法

    IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法

    很多公司都強(qiáng)制性要求使用Intellij?IDEA,其實(shí)Intellij?IDEA也確實(shí)很好用,但是一下子從Eclipse跳轉(zhuǎn)到Intellij?IDEA轉(zhuǎn)也是需要一段時(shí)間的,為了迎合之前的習(xí)慣,就需要在Intellij?IDEA中改變一些設(shè)置,如代碼自動(dòng)生成,本文給大家分享設(shè)置方法,感興趣的朋友一起看看吧
    2023-01-01
  • JAVA進(jìn)階之Spring?Boot自動(dòng)配置示例詳解

    JAVA進(jìn)階之Spring?Boot自動(dòng)配置示例詳解

    Spring Boot自動(dòng)配置是其核心特性之一,極大地簡(jiǎn)化了Spring應(yīng)用的開發(fā)過程,這篇文章主要介紹了JAVA進(jìn)階之Spring?Boot自動(dòng)配置示例詳解的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • Java 并行數(shù)據(jù)處理和性能分析

    Java 并行數(shù)據(jù)處理和性能分析

    這篇文章主要介紹了Java 并行數(shù)據(jù)處理和性能分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java運(yùn)算符從見過到掌握下

    Java運(yùn)算符從見過到掌握下

    計(jì)算機(jī)的最基本用途之一就是執(zhí)行數(shù)學(xué)運(yùn)算,作為一門計(jì)算機(jī)語言,Java也提供了一套豐富的運(yùn)算符來操縱變量,本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,緊接上篇,需要的朋友可以參考下
    2021-09-09
  • Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn)

    Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn)

    釘釘?shù)某霈F(xiàn)為企業(yè)節(jié)約了大量人力成本,其中也開放了大量的外部api接口方便企業(yè)使用。本文主要介紹了Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn),感興趣的可以了解一下
    2021-11-11
  • 分析Java中ArrayList與LinkedList列表結(jié)構(gòu)的源碼

    分析Java中ArrayList與LinkedList列表結(jié)構(gòu)的源碼

    這篇文章主要介紹了Java中ArrayList與LinkedList列表結(jié)構(gòu)的源碼,文章最后對(duì)LinkedList和ArrayList以及Vector的特性有一個(gè)對(duì)比總結(jié),需要的朋友可以參考下
    2016-05-05

最新評(píng)論

钟山县| 马边| 资阳市| 梅州市| 曲水县| 沙雅县| 伊川县| 南江县| 高碑店市| 平山县| 虹口区| 囊谦县| 兴城市| 栾川县| 九龙坡区| 西林县| 保定市| 巨鹿县| 新绛县| 延津县| 咸阳市| 宿松县| 崇阳县| 德保县| 白河县| 金山区| 军事| 孝义市| 佛坪县| 高陵县| 库车县| 通山县| 福州市| 伊春市| 慈溪市| 环江| 碌曲县| 青川县| 宁都县| 洮南市| 平塘县|