spingboot2---如何开启内容协商与自定义转换器

使用场景

有时我们在开发时会遇到这种情况,前端在特定的接口需要后端访问xml或者是其他格式数据。

前提

以xml为列,后端需要映入xml依赖

		<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>

请求头方式内容协商

在访问后端时携带请求头,从而告诉后端本次请求客户端可以处理的数据格式。如图

在这里插入图片描述

参数方式内容协商

server:
  port: 9072
spring:
  mvc:
    contentnegotiation:
      #是否应使用请求参数(默认为“格式”)来确定请求的媒体类型
      favor-parameter: true
      #启用“favor-parameter”时要使用的查询参数名称,默认format
      parameter-name: format_type

在这里插入图片描述

在这里插入图片描述

自定义转换器

当我们想自定义一个内容协商时 则需要使用到自定义 MessageConverte。代码如下

import com.lylbp.entity.Car;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.*;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.List;

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    /**
     * 映射mediaType与参数方式内容协商关系
     * 如若不重写参数方式内容协商不可用
     *
     * @param configurer
     */
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("lylbp", MediaType.parseMediaType("application/lylbp"));
    }

    /**
     * 扩充转换器
     *
     * @param converters
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new HttpMessageConverter<Car>() {
            @Override
            public boolean canRead(Class<?> clazz, MediaType mediaType) {
                return false;
            }

            @Override
            public boolean canWrite(Class<?> clazz, MediaType mediaType) {
                return clazz.isAssignableFrom(Car.class);
            }

            @Override
            public List<MediaType> getSupportedMediaTypes() {
                return MediaType.parseMediaTypes("application/lylbp");
            }

            @Override
            public Car read(Class<? extends Car> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
                return null;
            }

            @Override
            public void write(Car car, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
                String data = car.getVehicleNo() + "," + car.getVehicleBrand();
                //写出去s
                OutputStream body = outputMessage.getBody();
                body.write(data.getBytes(Charset.forName("utf-8")));
            }
        });
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值