2、需求:
1)、浏览器发请求返回xml [application/xml] jacksonXmlConverter
2)、如果是ajax请求返回json [application/json] jackJsonConverter
3)、如果app硅谷发请求,返回自定义协议数据 [application/x-guigu] xxxConverter
需求:自定义内容协商:“application/x-guigu”。数据写出的格式为:数据属性间以分号“;”隔开。
第一步:创建Bean类Person。
package com.wzy.springbootweb01.bean;
@Data//提供Getter、Setter方法。
public class Person {
private String userName;
private Integer age;
}
第二步:创建自定义GuiguMessageConverter
,实现接口HttpMessageConverter<Person>
。<Person>
为数据源类型。
package com.wzy.springbootweb01.converter;
/*自定义converter*/
public class GuiguMessageConverter implements HttpMessageConverter<Person> {
//可不可以,把aClass类型的数据,读成mediaType。
@Override
public boolean canRead(Class<?> aClass, MediaType mediaType) {
return false;
}
//可不可以,把aClass类型的数据,写成 mediaType。
@Override
public boolean canWrite(Class<?> aClass, MediaType mediaType) {
//return true;
return aClass.isAssignableFrom(Person.class);//设置为:只要是Person类型的就能读写。
}
//获取所有媒体支持类型。
//服务器统计所有MessageConverter 都能写出哪些内容类型。
@Override
public List<MediaType> getSupportedMediaTypes() {
return MediaType.parseMediaTypes("application/x-guigu");//自定义类型接收格式
}
@Override
public Person read(Class<? extends Person> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}
//自定义内容协商格式(数据写出的格式,数据属性以分号“;”隔开)。
@Override
public void write(Person person, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
//把属性值之间以分号“;”隔开。
String data = person.getUserName() + ";" + person.getAge();
//写出去
OutputStream body = httpOutputMessage.getBody();
body.write(data.getBytes(StandardCharsets.UTF_8));
}
}
第三步:在配置文件类 MyConfig
中,配置自定义协议类。
package com.wzy.springbootweb01.boot;
@Configuration/*(proxyBeanMethods = false)*/
public class MyConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer(){//增强功能
return new WebMvcConfigurer() {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new GuiguMessageConverter());
}
}
第四步:创建Controller测试类。
package com.wzy.springbootweb01.controller;
@Controller//创建处理器对象,并把处理器对象中,处理器方法处理的结果输出到浏览器。
public class MyConyroller11Json {
@ResponseBody
@RequestMapping(value = "getJson",method = RequestMethod.GET)
public Person getJson(){
Person person = new Person();
person.setUserName("张三");
person.setAge(25);
return person;
}
}
第五步:测试。数据是以分号“;”隔开的