使用场景
有时我们在开发时会遇到这种情况,前端在特定的接口需要后端访问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")));
}
});
}
}