其实SpringBoot的底层就是SpringMVC支持的,我们自定义数据输出格式的时候步骤有三个
- 自定义的HttpMessageConverter
- 将我们自定义的HttpMessageConverter添加到系统中去
- 系统在接受到请求之后,就会按照我们的需要的数据类型(我们自定义数类型:application/x-custom)匹配对应的HttpMessageConverter来处理
事例JavaBean
@Data
public class Person {
private String name;
private Integer age;
}
自定义的HttpMessageConverter:需要告诉系统我们自定义的HttpMessageConverter支持的数据类型(application/x-custom)、告诉系统我们自定义输出数据的具体的格式(就是将Person对象的属性按照分号隔开)
public class MyHttpMessageConverter implements HttpMessageConverter<Person> {
/**
* 服务器会统计所有的MessageConverter支持的数据类型,所有我们这里也要告诉系统我们这个自定义的MessageConverter支持的数据类型
* 我们这里支持的类型为:application/x-custom
*
* @return
*/
@Override
public List<MediaType> getSupportedMediaTypes() {
return MediaType.parseMediaTypes("application/x-custom");
}
/**
* 告诉系统只要是Person类型的数据我们这里自定义的MessageConverter都能写
*/
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return clazz.isAssignableFrom(Person.class);
}
/**
* 告诉系统我们这里的application/x-custom类型的数据时什么样子的
* (就是将Person对象的属性按照分号隔开)
*/
@Override
public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//自定义输出数据格式
String retrunRsult = person.getName() + ";" + person.getAge() + ";";
//通过OutputStream将自定义数据写出去
OutputStream body = outputMessage.getBody();
body.write(retrunRsult.getBytes());
body.flush();
}
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
public Person read(Class<? extends Person> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
}
将我们自定义的HttpMessageConverter添加到系统中去
@EnableWebMvc //SpringBoot的底层就是SpringMVC的支持
@Configuration //告诉SpringBoot这是一个配置类
public class MyConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MyHttpMessageConverter myHttpMessageConverter = new MyHttpMessageConverter();
converters.add(myHttpMessageConverter);
}
};
}
}
服务端写controller接受客户端请求
@RestController
public class PersonController {
@GetMapping("/get-person")
public Person getPerson() {
Person person = new Person();
person.setName("ZhangSan");
person.setAge(18);
return person;
}
}
前端请求将请求头的Accept设置成我们自定的值:application/x-custom,我们就能够看到返回的数据就是按照我们自定义的格式(把Person对形象的属性按照分号隔开)返回了