学习目标:extendMessageConverters自定义
学习内容:
1:第一步:实现HttpMessageConverter接口 ,自定义处理类型的响应数据格式。
public class DefineUserMessageConverter implements HttpMessageConverter<User> {
//本次只做了@ResponseBody写出 所以 关于Read的直接返回false 或者 null
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
//指定可以处理的类型
return clazz.isAssignableFrom(User.class);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
return MediaType.parseMediaTypes("application/x-ddd");
}
@Override
public User read(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
@Override
public void write(User user, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 自定义协议数据写出
String u = user.getUsername()+"***"+user.getGender()+"***"+user.getAge()+"***"+user.getLikes();
//写出去
OutputStream body = outputMessage.getBody();
body.write(u.getBytes());
}
}
2:第二步:
@Configuration
public class SpringMvcDefinition {
@Bean
public WebMvcConfigurer enableMatrixVariable(){
return new WebMvcConfigurer() {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//将自定义 MessageConverter,
//添加到MediaType 集合中
converters.add(new DefineUserMessageConverter());
}
};
}
3:第三步:配置Yaml文件
spring:
mvc:
contentnegotiation:
# 开启内容协商功能,根据客户端的请求头判断支持的返回数据类型
favor-parameter: true
media-types:
uu : application/x-ddd
`提示:默认springboot-start-web只是引入了jackson 返回json数据,如果需要xml格式需要自己引入xml解析的jar包
<!--利用下面这个包可以返回xml数据-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
请求示例如下:
-
json
-
xml
-
自定义的 uu
`提示:configureMessageConverters会覆盖原有的MediaType,extendMessageConverters是对于原有的扩展,
//如果想提高自定义MessageConverters的优先级别,可以用@Order指定或者
converters.add(0,new DefineUserMessageConverter());//利用这个重载方法