自定义HttpMessageConverter学习笔记

实现Content-Type为text/properties媒体类型的HttpMessageConverter
  1. 编写HttpMessageConverter实现类(核心处理逻辑)
    // 参考MappingJackson2HttpMessageConverter
    public class PropertiesHttpMessageConverter extends AbstractGenericHttpMessageConverter<Properties> {
        public PropertiesHttpMessageConverter(){
            super(new MediaType("text", "properties"));
        }
        @Override
        protected void writeInternal(Properties properties, Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
            OutputStream body = outputMessage.getBody();
            Charset charset = this.getCharset(outputMessage) ;
            Writer writer = new OutputStreamWriter(body,charset) ;
            // 这里要使用字符流,以防止中文乱码
            properties.store(writer,"form PropertiesHttpMessageConverter");
        }
        @Override
        protected Properties readInternal(Class<? extends Properties> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
            InputStream body = inputMessage.getBody();
            Properties properties = new Properties() ;
            // 从Content-Type解析编码
            Charset charset = getCharset(inputMessage) ;
            InputStreamReader reader = new InputStreamReader(body, charset) ;
            // 注意这里要使用字符流,否则会有中文乱码
            properties.load(reader);
            return properties;
        }
        private Charset getCharset(HttpMessage inputMessage){
            // 从Content-Type解析编码
            HttpHeaders headers = inputMessage.getHeaders();
            MediaType contentType = headers.getContentType();
            Charset charset = contentType.getCharset();
            charset = charset == null ? Charset.forName("UTF-8") : charset ;
            return charset ;
        }
        @Override
        public Properties read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
            return readInternal(null, inputMessage);
        }
    }
    
  2. 将自定义HttpMessageConverter添加到RequestMappingHandlerAdapter中
    @Configuration
    public class RestWebMvcConfigurer implements WebMvcConfigurer {
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            // 插入到第一位,其他Converter向后移动
            converters.add(0,new PropertiesHttpMessageConverter());
            // 添加到最后时,结果会被MappingJackson2HttpMessageConverter处理返回json
            //converters.add(new PropertiesHttpMessageConverter());
        }
    }
    
  3. 编写业务Controller
    @RestController
    public class PropertiesRestController {
        @PostMapping(value = "/add/props",
            consumes = "text/properties;charset=UTF-8"/*,produces = "text/properties"*/)
        public Properties addProp(@RequestBody Properties properties){
            log.info("====> prop : {}" , properties);
            return properties ;
        }
    }
    
  4. 使用PostMan发送请求,将Header的Content-Type设置为text/properties
    4.1 header内容
        Content-Type设置为text/properties
    4.1 body内容
        username=yicj
        addr=北京
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值