当我们想自定义一种消息类型去返回的时候,可以实现HttpMessageConverter进行重写
@RestController
public class TestController {
@GetMapping(value = "/aa")
public User aa(){
User user=new User();
user.setName("张三");
user.setPwd("123");
return user;
}
}
必须要有@RestController或者@ResponseBody
因为消息转换器是基于@ResponseBody来返回的
package com.example.demo.entity;
public class User {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
package com.example.demo.config;
import com.example.demo.entity.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.server.ServletServerHttpResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
/**
* 自定义消息转换器
*/
public class MyHttpMessageConvert implements HttpMessageConverter<User> {
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return true;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
//判断返回的是不是A这个类
return clazz.isAssignableFrom(User.class);
}
@Override
public List<MediaType> getSupportedMediaTypes() {
//返回媒体类型
return MediaType.parseMediaTypes("application/json");
}
/**
* 请求的内容
* @param clazz
* @param inputMessage
* @return
* @throws IOException
* @throws HttpMessageNotReadableException
*/
@Override
public User read(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
System.out.println(clazz);
return null;
}
/**
* 返回的内容
* @param a
* @param contentType 会获取getSupportedMediaTypes()方法的媒体类型
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
*/
@Override
public void write(User a, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//设置返回类型的header头,如果不设置 那么前端无法解析 就会出现乱码
((ServletServerHttpResponse) outputMessage).getServletResponse()
.setHeader("Content-Type","application/json");
OutputStream outputStream = outputMessage.getBody();
//创建json对象
ObjectMapper objectMapper=new ObjectMapper();
//把对象写入流中
objectMapper.writeValue(outputStream,a);
//关闭流
outputStream.close();
}
}
配置消息转换器,让自己的在第一个访问
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class TestConfig implements WebMvcConfigurer {
/**
* 配置消息转换器
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//把自定义的消息转换器添加到消息转换器集合中 第一个位置 先执行我们自定义的消息转换器
converters.add(0,new MyHttpMessageConvert());
}
}
我们可以在这里自定义返回类型,但是必须是前端能支持的类型,否则就会出现无法解析的情况
也可以把User对象返回字符串
/**
* 返回的内容
* @param a
* @param contentType 会获取getSupportedMediaTypes()方法的媒体类型
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
*/
@Override
public void write(User a, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
((ServletServerHttpResponse)outputMessage).getServletResponse()
.setHeader("content-type", "text/html;charset=utf-8");
String str=a.getName()+"--"+a.getPwd();
OutputStream outputStream = outputMessage.getBody();
outputStream.write(str.getBytes());
//关闭流
outputStream.close();
}