天天看点

springboot(十)自定义转换器发送properties数据和byte[]数据

作者:聪明的晚风zqw

1、定义PropertiesHttpMessageConverter类继承抽象类AbstractHttpMessageConverter。自定义一个application/properties+user的Content-Type

package com.zqw.springboot.learn.boot.config;

import com.zqw.springboot.learn.boot.domain.User;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Properties;

public class PropertiesHttpMessageConverter extends
        AbstractHttpMessageConverter<User> {
    public PropertiesHttpMessageConverter() {
        super(MediaType.valueOf(Constants.PROPERTIES_USER));
        setDefaultCharset(Charset.forName("utf-8"));
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return clazz.isAssignableFrom(User.class);
    }

    @Override
    protected User readInternal(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        InputStream is = inputMessage.getBody();
        Properties props = new Properties();
        props.load(is);
        String id = props.getProperty("id");
        String name = props.getProperty("name");
        User user = new User();
        user.setId(id);
        user.setName(name);
        return user;
    }

    @Override
    protected void writeInternal(User user, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        OutputStream os = outputMessage.getBody();
        Properties properties = new Properties();
        properties.setProperty("id", user.getId());
        properties.setProperty("name", user.getName());
        properties.store(os, "user comments");
    }
}
           

2、自定义WebMvcConfigurer

package com.zqw.springboot.learn.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/*
* 添加Properties转换
* */
@Configuration
public class WebConfig1 implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new PropertiesHttpMessageConverter());
        converters.add(new BytesHttpMessageConvert());
//        converters.set(0, new BytesHttpMessageConvert());
    }
}
           

3、定义 json2prop或者prop2json接口,produces 对应请求header的Accept, consumers 对应header的Content-Type

package com.zqw.springboot.learn.boot.web;

import com.zqw.springboot.learn.boot.config.Constants;
import com.zqw.springboot.learn.boot.domain.User;
import com.zqw.springboot.learn.boot.utils.MathUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.Random;

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable String id){
        User user = new User();
        user.setId(id);
        return user;
    }
    /*将json转为properties*/
    @PostMapping(value = "/user/json2prop",
                consumes = {MediaType.APPLICATION_JSON_UTF8_VALUE},
                produces = {Constants.PROPERTIES_USER})
    public User json2prop(@RequestBody User user){
        return user;
    }
    /*将properties转为json*/
    @PostMapping(value ="/user/prop2json",
                consumes = {Constants.PROPERTIES_USER},
                produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
    public User prop2json(@RequestBody User user){
        return user;
    }

}           

自定义byte[]转换器可见github源码,其中前台解析代码见static下test.html

源码地址:

https://github.com/zhuquanwen/bootlearn2018

继续阅读