1、自定义一个我们自己的协议x-djy
(1)创建DjyHttpMessageConverter类
public class DjyHttpMessageConverter implements HttpMessageConverter<Pet> {@Overridepublic boolean canRead(Class<?> clazz, MediaType mediaType) {return false;}@Overridepublic boolean canWrite(Class<?> clazz, MediaType mediaType) {return clazz.isAssignableFrom(Pet.class);}@Overridepublic List<MediaType> getSupportedMediaTypes() {return MediaType.parseMediaTypes("application/x-djy;charset=UTF-8");}@Overridepublic Pet read(Class<? extends Pet> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}@Overridepublic void write(Pet pet, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {final HttpHeaders headers = outputMessage.getHeaders();headers.setContentType(contentType);OutputStream body = outputMessage.getBody();String data = pet.getName()+","+pet.getAge();OutputStreamWriter outputStreamWriter = new OutputStreamWriter(body, Charset.defaultCharset());outputStreamWriter.write(data);outputStreamWriter.flush();}}
(2)创建配置类用哪个@Configuration+@Bean的方式 注入WebMvcConfigurer对象,实现WebMvcConfigurer里面的extendMessageConverters方法
- extendMessageConverters 是可以补充我们自己的响应处理类
configureMessageConverters是会直接替换所有消息响应类,使用你自定义的
@Configuration(proxyBeanMethods = false)public class MyConfig{@Beanpublic WebMvcConfigurer webMvcConfigurer(){WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new DjyHttpMessageConverter());}};return webMvcConfigurer;}}
(3)请求接口
@ResponseBody @GetMapping("/pet") public Pet getPet(){ Pet pet = new Pet(); pet.setAge(3); pet.setName("小花"); return pet; }(4)用Postman测试请求头中添加accept参数,设置值application/x-djy
2、开启请求参数format功能
(1)application.yaml中开启参数
spring: mvc: contentnegotiation: favor-parameter: true(2)开启之后我们就可以使用format来请求数据,但是format默认只支持2种数据
format=json
- format=xml

(3)我们把上面的x-djy协议也加入到format中
- 需要在Spring配置类中添加format协议支持
- 通过WebMvcConfigurer中的configureContentNegotiation方法
添加自定义的协议到format中configurer.mediaType(“x-djy”,MediaType.parseMediaType(“application/x-djy”));
@Configuration(proxyBeanMethods = false) public class MyConfig{ @Bean public WebMvcConfigurer webMvcConfigurer(){ WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new DjyHttpMessageConverter()); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("x-djy", MediaType.parseMediaType("application/x-djy")); } }; return webMvcConfigurer; } }也可以使用ContentNegotiationConfigurer的strategies方法来添加协议
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { //configurer.mediaType("x-djy", MediaType.parseMediaType("application/x-djy")); HashMap<String, MediaType> stringMediaTypeHashMap = new HashMap<>(); stringMediaTypeHashMap.put("json",MediaType.parseMediaType("application/json")); stringMediaTypeHashMap.put("x-djy",MediaType.parseMediaType("application/x-djy")); //值得注意的是,我们从底层了解到,即使你不设置xml的支持,底层在找能不能支持这种类型的时候,也会从底层的支持的文件类型中查找 //所以你完全可以不设置json和xml也可以返回这些协议 ParameterContentNegotiationStrategy parameterContentNegotiationStrategy = new ParameterContentNegotiationStrategy(stringMediaTypeHashMap); configurer.strategies(Arrays.asList(parameterContentNegotiationStrategy)); }
(4)测试可以得到数据
