展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

自定义内容协商策略

  • 在浏览器搜索框中输入的方式只有format=json和format=xml,我们希望输入format=gg时,服务器能使用我们自定义的内容协商x-guigu

那么我们需要在配置类中配置如下,这时在浏览器搜索框中输入format=gg即可响应x-guigu类型的数据
序号1处是自定义的协商策略,有可能我们添加的自定义的功能会覆盖默认很多功能,导致一些默认的功能失效,
这里我们自定义了序号1处基于参数的协商策略,导致基于请求的协商策略失效(此时postman中测试发现失效),
解决方案是将序号2处的基于请求头的协商策略添加进来,这时postman测试也能成功
  • 实现代码
@Configuration(proxyBeanMethods = false)
public class WebConfig {

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

            /**
             * 自定义内容协商策略
             * @param configurer
             */
            @Override
            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                //Map<String, MediaType> mediaTypes
                Map<String, MediaType> mediaTypes = new HashMap<>();
                mediaTypes.put("json",MediaType.APPLICATION_JSON);
                mediaTypes.put("xml",MediaType.APPLICATION_XML);
                mediaTypes.put("gg",MediaType.parseMediaType("application/x-guigu"));  # 自定义的协商策略   1
                //指定支持解析哪些参数对应的哪些媒体类型;接收的参数为 Map<String, MediaType> mediaTypes
                ParameterContentNegotiationStrategy parameterStrategy = new ParameterContentNegotiationStrategy(mediaTypes);
                // 基于请求头的协商策略
                HeaderContentNegotiationStrategy headeStrategy = new HeaderContentNegotiationStrategy();
                // 将自定义策略和基于请求头的策略应用
                configurer.strategies(Arrays.asList(parameterStrategy,headeStrategy));
            }

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

        };
    }

}
posted @ 2022-07-30 12:33  DogLeftover  阅读(20)  评论(0编辑  收藏  举报