欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在我們的日常開發(fā)中,作為服務(wù)端,接收的數(shù)據(jù)是加密的字符串。我們可能會在Controller中獲取到加密的字符串,然后手動解密,類似于如下做法(用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兩個注解,分別完成請求報文到對象和對象到響應(yīng)報文的轉(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;

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

    public Base64ObjMessageConverter() {
        // 新建一個我們自定義的媒體類型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,并重寫了它的幾個方法。

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

構(gòu)造方法定義了要處理的MediaType,這里我定義的是application/base64obj;charset=utf-8,接下來在Controller中也要用到這個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)換器處理我們的請求。

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

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

注意:

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

PostMan請求測試

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

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

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

總結(jié)

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

相關(guān)文章

  • java實(shí)現(xiàn)LRU緩存淘汰算法的方法

    java實(shí)現(xiàn)LRU緩存淘汰算法的方法

    LRU(Least recently used,最近最少使用)算法根據(jù)數(shù)據(jù)的歷史訪問記錄來進(jìn)行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高”。下面看下java實(shí)現(xiàn)LRU緩存淘汰算法的方法,一起看看吧
    2021-11-11
  • Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例

    Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例

    這篇文章主要介紹了Java的DelayQueue延遲隊(duì)列簡單使用代碼實(shí)例,DelayQueue是一個延遲隊(duì)列,插入隊(duì)列的數(shù)據(jù)只有達(dá)到設(shè)置的延遲時間時才能被取出,否則線程會被阻塞,插入隊(duì)列的對象必須實(shí)現(xiàn)Delayed接口,需要的朋友可以參考下
    2023-12-12
  • SpringBoot生成和操作PDF的代碼詳解

    SpringBoot生成和操作PDF的代碼詳解

    本文主要介紹了在SpringBoot項(xiàng)目下,通過代碼和操作步驟,詳細(xì)的介紹了如何操作PDF,希望可以幫助到準(zhǔn)備通過JAVA操作PDF的你,項(xiàng)目框架用的SpringBoot,但在JAVA中代碼都是通用的,需要的朋友可以參考下
    2025-01-01
  • RabbitMQ中的延遲隊(duì)列機(jī)制詳解

    RabbitMQ中的延遲隊(duì)列機(jī)制詳解

    這篇文章主要介紹了RabbitMQ中的延遲隊(duì)列機(jī)制詳解,延時隊(duì)列內(nèi)部是有序的,最重要的特性就體現(xiàn)在它的延時屬性上,延時隊(duì)列中的元素是希望,在指定時間到了以后或之前取出和處理,簡單來說,延時隊(duì)列就是用來存放需要在指定時間被處理的元素的隊(duì)列,需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)從Html文本中提取純文本的方法

    Java實(shí)現(xiàn)從Html文本中提取純文本的方法

    今天小編就為大家分享一篇Java實(shí)現(xiàn)從Html文本中提取純文本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Java快速排序案例講解

    Java快速排序案例講解

    這篇文章主要介紹了Java快速排序案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解JAVA設(shè)計(jì)模式之適配器模式

    詳解JAVA設(shè)計(jì)模式之適配器模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之適配器模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解
    2020-06-06
  • JAVA日志框架之JUL、JDK原生日志框架詳解

    JAVA日志框架之JUL、JDK原生日志框架詳解

    Java語言的強(qiáng)大之處就是因?yàn)樗鼜?qiáng)大而且成熟的生態(tài)體系,其中包括日志框架,下面這篇文章主要給大家介紹了關(guān)于JAVA日志框架之JUL、JDK原生日志框架的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • spring framework源碼調(diào)試技巧

    spring framework源碼調(diào)試技巧

    這篇文章給大家介紹了spring-framework源碼調(diào)試方法,可以直接將最新代碼clone到本地,如果想在代碼做一些注釋,也可以Fork到自己的倉庫。本文采用Fork的方式,并添加了測試module,感興趣的朋友一起看看吧
    2021-10-10
  • Application.yml的自定義屬性的讀取方式

    Application.yml的自定義屬性的讀取方式

    這篇文章主要介紹了Application.yml的自定義屬性的讀取方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論