0
点赞
收藏
分享

微信扫一扫

自定义内容协商

  • 若我们想自定义一种内容协商,例如自定义x-guigu,如果使用这种响应格式时,我们想让服务器响应给客户端只有属性值且用分号隔开的数据格式:属性值1;属性值2
  • 内容协商的原理是:服务器获取客户端可接收的内容类型,服务端遍历系统中所有MessageConverter,看是否有客户端所需的类型,如果有,则解析后响应给客户端
  • 自定义的Converter

public class GuiguMessageConverter implements HttpMessageConverter<Person> {

@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return false;
}

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

/**
* 服务器要统计所有MessageConverter都能写出哪些内容类型
*
* application/x-guigu
* @return
*/
@Override
public List<MediaType> getSupportedMediaTypes() {
return MediaType.parseMediaTypes("application/x-guigu");
}

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

@Override
public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//自定义协议数据的写出
String data = person.getUserName()+";"+person.getAge()+";"+person.getBirth();


//写出去
OutputStream body = outputMessage.getBody();
body.write(data.getBytes());
}
}

  • 在配置类中:将自定义的格式添加到系统

@Configuration(proxyBeanMethods = false)
public class WebConfig {

//1、WebMvcConfigurer定制化SpringMVC的功能
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new GuiguMessageConverter());
}

};
}

}

  • 这时在postman中要求响应给前端application/x-guigu格式的内容,响应的内容为:goudan, 12, 男

    @ResponseBody  //利用返回值处理器里面的消息转换器进行处理
@GetMapping(value = "/test/person")
public Person getPerson(){
Person person = new Person();
person.setAge(28);
person.setBirth(new Date());
person.setUserName("zhangsan");
return person;
}



举报

相关推荐

0 条评论