栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot添加自定义HttpMessageConverter

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot添加自定义HttpMessageConverter

为什么需要自定义MessageConverter,当我们想要让一些数据以我们自定义的格式返回,而不是普通的json或xml格式的数据。并且底层的最终是遍历MessageConverter,然后再进行数据转换的。

首先需要创建一个自己的HttpMessageConverter,代码如下

public class MyMessageConverter implements HttpMessageConverter {

    @Override
    public boolean canRead(Class clazz, MediaType mediaType) {
        return false;
    }
    //Pet只是用来测试的一个pojo类
    @Override
    public boolean canWrite(Class clazz, MediaType mediaType) {
        return clazz.isAssignableFrom(Pet.class);
    }
   //设置能够转换的媒体类型
    @Override
    public List getSupportedMediaTypes() {
        return MediaType.parseMediaTypes("application/mydata");
    }

    @Override
    public List getSupportedMediaTypes(Class clazz) {
        return HttpMessageConverter.super.getSupportedMediaTypes(clazz);
    }

    @Override
    public Pet read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override
    public void write(Pet pet, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        OutputStream body = outputMessage.getBody();
        String myout="测试数据"+pet.getName()+pet.getAge();
        body.write(myout.getBytes());
    }
}
复制代码

然后再将我们的自定义的HttpMessageConverter丢到我们的springmvc容器中,一般这种都是通过 WebMvcConfigurer来添加的,代码如下

@Configuration
public class MyMessageConverterConfig {

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void extendMessageConverters(List> converters) {
                converters.add(new MyMessageConverter());
            }
        };

    }
}
复制代码

需要注意 这种情况只能处理设置了请求头accept为自定义媒体类型的情况(这里我们设置的是application/mydata)

如果想通过添加请求参数format来修改数据的返回类型的话,可以采用下面的方法

//自定义strategies,注意上面的代码也依旧要保留,因为最终的处理还是上面的HttpMessageConverter
@Configuration
public class MyMessageConverterConfig {

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                Map mediaTypes = new HashMap<>();
                mediaTypes.put("json", MediaType.APPLICATION_JSON);
                mediaTypes.put("xml", MediaType.APPLICATION_XML);
                mediaTypes.put("mydata", MediaType.parseMediaType("application/mydata"));
                ParameterContentNegotiationStrategy strategys = new ParameterContentNegotiationStrategy(mediaTypes);
                //不加header的话,在没有format的情况下,不管accept是什么值都会返回json数据
                HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy();
                configurer.strategies(Arrays.asList(strategys,headerStrategy));
            }

            @Override
            public void extendMessageConverters(List> converters) {
                converters.add(new MyMessageConverter());
            }
        };

    }
}
复制代码

添加之后,底层的strategies如下

默认的如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号