springboot实战第四章-自定义HttpMessageConverter

springboot实战第四章-自定义HttpMessageConverter

自定义HttpMessageConverter

  HttpMessageConverter是用来处理request和response里的数据的。Spring内置了很多HttpMessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等。

  本章实现自定义的HttpMessageConverter,很简单。

1.自定义HttpMessageConverter

package com.just.springmvc4.messageconverter;

import com.just.springmvc4.domain.DemoObj;
import java.io.IOException;
import java.nio.charset.Charset;
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;

public class MyMessageConverter extends AbstractHttpMessageConverter<DemoObj> {
    /**
     * 定义字符编码,防止乱码
     */
    private static final Charset DEFAULT_CHARSET=Charset.forName("UTF-8");
    /**
     * 新建自定义的媒体类型
     */
    public MyMessageConverter(){
        super(new MediaType("application","x-wisely",DEFAULT_CHARSET));
    }

    /**
     * 表明只处理DemoObj这个类
     */
    @Override
    protected boolean supports(Class<?> aClass) {
        return DemoObj.class.isAssignableFrom(aClass);
    }

    /**
     * 重写readInternal方法,处理请求的数据
     */
    @Override
    protected DemoObj readInternal(Class<? extends DemoObj> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        String temp=StreamUtils.copyToString(httpInputMessage.getBody(),DEFAULT_CHARSET);
        String[] tempArr=temp.split("-");
        return new DemoObj(new Long(tempArr[0]),tempArr[1]);
    }

    /**
     * 重写writeInternal,处理如何输出数据到response
     */
    @Override
    protected void writeInternal(DemoObj demoObj, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
        String out="hello: "+demoObj.getId()+"-"+demoObj.getName();
        StreamUtils.copy(out, DEFAULT_CHARSET, httpOutputMessage.getBody());
    }
}

在本实例中我进行了编码的处理,为了防止中文乱码,输入输出的编码格式统一为UTF-8

2.配置文件MyMvcConfig中添加自定义的HttpMessageConverter

/**
     * 添加自定义的httpMessageConverter
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(messageConverter());
    }

    @Bean
    public MyMessageConverter messageConverter(){
        return new MyMessageConverter();
    }

3.控制器

package com.just.springmvc4.controller;

import com.just.springmvc4.domain.DemoObj;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConverterController {
    @RequestMapping(value = "/converter",produces = "application/x-wisely")
    public DemoObj converter(@RequestBody DemoObj demoObj){
         return demoObj;
    }
}

produces指定返回自定义的媒体类型

4.自定义的jsp页面以及ViewController里的配置

converter.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>converter测试</title>
</head>
<body>
   <div id="resp"></div>
<input type="button" value="请求" onclick="req()">

<script src="../assets/js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script>
    function req() {
        $.ajax(
            {
                url:"converter",
                data:"1000-goodluck",
                type:"POST",
                contentType:"application/x-wisely",
                success:function (data) {
                    $("#resp").html(data);
                }
            }
        )
    }
</script>
</body>
</html>

ViewController配置:

@Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/toUpload").setViewName("upload");
        registry.addViewController("/toConverter").setViewName("converter");
    }

5.结果演示:

springboot实战第四章-自定义HttpMessageConverter

//TODO:本实例只是自定义的HttpMessageConverter,在实际场景中可能有全局的处理,比如要全局请求与返回都要是Json格式,这个等有空了尝试下。

书接上文,既然这个HttpMessageConverter这么牛逼,这次来个全局的处理,输入和输出都自动转成json。

实现这个功能需要两样东西,第一个是pom文件中加入jackson的jar包,第二个是在配置文件中加入MappingJackson2HttpMessageConverter

pom.xml:

springboot实战第四章-自定义HttpMessageConverter

配置文件MyMvcConfig添加:

springboot实战第四章-自定义HttpMessageConverter

controller测试,直接返回一个map:

springboot实战第四章-自定义HttpMessageConverter

实验结果:

springboot实战第四章-自定义HttpMessageConverter

good work.

项目地址:https://gitee.com/yuanhan93/springmvc4Learning

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 压缩包文件的解压密码如何激活成功教程

    压缩包文件的解压密码如何激活成功教程压缩包文件带有解压码,在不知道密码的情况下,想要解压文件,需要使用激活成功教程软件将解压密码找回才能顺利解压文件,比如使用奥凯丰压缩包解密大师【压缩包解密大师】快速找回密码_轻松移除使用限制-奥凯丰okfone压缩包大师是奥凯丰推出的一款可以找回RAR打开密码以及移除RAR使用限制的软件,使用户可以自由编辑和打印RAR文件https://www.okfone.com/onepass-for-rar/onepass-for-rar.html将压缩包(支持rar、zip、7z格式)添加到软件中,选择一种找回方法,

    2022年10月24日
  • goland2021.11.4 激活【中文破解版】「建议收藏」

    (goland2021.11.4 激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 使用MQTTnet搭建Mqtt服务器

    使用MQTTnet搭建Mqtt服务器官方介绍:MQTTnetMQTTnetisahighperformance.NETlibraryforMQTTbasedcommunication.ItprovidesaMQTTclientandaMQTTserver(broker).Theimplementationisbasedonthedocumentationfrom h…

  • 数据库(第一范式,第二范式,第三范式)

    数据库(第一范式,第二范式,第三范式)数据库(第一范式,第二范式,第三范式)范式:英文名称是NormalForm,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,

  • Jmeter 参数化实现

    Jmeter 参数化实现在测试过程中,我们经常遇到需要根据需求动态操作数据的情况,常规的固定数据无法满足我们的需要,这个时候,我们可以通过jmeter提供的参数化组件来实现动态的获取数据、改变数据。Jmeter中常用的参数化方式jmeter为我们提供了四种实现参数化的方式,分别是【CSVDataSetConfig】(数据集配置)组件、【用户参数】组件、【用户定义的变量】组件和【函数】组件,四种方式都有…

  • vue富文本编辑器的使用_elementui富文本

    vue富文本编辑器的使用_elementui富文本写好的富文本编辑器,附带功能齐全,复制即用!!!(Quill官方中文文档)一、安装二、注册1.在.main.js中注册富文本编辑器三、使用1.以下是写好的富文本编辑器,附带功能齐全(Quill官方中文文档)2.新建一个Editor文件夹,文件夹下创建一个index.vue文件,将此复制到vue文件里3.将Editor文件夹放入Vue项目的components组件包里方便其他页面直接引用富文本编辑器5.页面引入刚刚写好的富文本编辑器组件6.效果:………

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号