天天看點

springboot restTemplate 自定義消息轉換器

springboot restTemplate 自定义消息转换器

 

 

***********************

相关类与接口

 

HttpMessageConverter

public interface HttpMessageConverter<T> {
    boolean canRead(Class<?> var1, @Nullable MediaType var2);

    boolean canWrite(Class<?> var1, @Nullable MediaType var2);

    List<MediaType> getSupportedMediaTypes();

    T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException;

    void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException;
}
           

 

AbstractHttpMessageConverter

public abstract class AbstractHttpMessageConverter<T> implements HttpMessageConverter<T> {
    protected final Log logger = HttpLogging.forLogName(this.getClass());
    private List<MediaType> supportedMediaTypes = Collections.emptyList();
    @Nullable
    private Charset defaultCharset;


***********
构造方法

    protected AbstractHttpMessageConverter() {
    }

    protected AbstractHttpMessageConverter(MediaType supportedMediaType) {
        this.setSupportedMediaTypes(Collections.singletonList(supportedMediaType));
    }

    protected AbstractHttpMessageConverter(MediaType... supportedMediaTypes) {
        this.setSupportedMediaTypes(Arrays.asList(supportedMediaTypes));
    }

    protected AbstractHttpMessageConverter(Charset defaultCharset, MediaType... supportedMediaTypes) {
        this.defaultCharset = defaultCharset;
        this.setSupportedMediaTypes(Arrays.asList(supportedMediaTypes));
    }



***********
普通方法

    public void setSupportedMediaTypes(List<MediaType> supportedMediaTypes) {
    public List<MediaType> getSupportedMediaTypes() {

    public void setDefaultCharset(@Nullable Charset defaultCharset) {
    public Charset getDefaultCharset() {

    public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) {
    protected boolean canRead(@Nullable MediaType mediaType) {

    public final T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {


    public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
    protected boolean canWrite(@Nullable MediaType mediaType) {

    public final void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {


    protected void addDefaultHeaders(HttpHeaders headers, T t, @Nullable MediaType contentType) throws IOException {

    protected MediaType getDefaultContentType(T t) throws IOException {
    protected Long getContentLength(T t, @Nullable MediaType contentType) throws IOException {


    protected abstract boolean supports(Class<?> var1);
    protected abstract T readInternal(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException;
    protected abstract void writeInternal(T var1, HttpOutputMessage var2) throws IOException, HttpMessageNotWritableException;
           

 

 

***********************

示例

 

******************

config 层

 

CustomHttpMessageConverter:使用fastjson序列化、反序列化对象

@Component
public class CustomHttpMessageConverter extends AbstractHttpMessageConverter<Object> {

    public CustomHttpMessageConverter(){
        super(StandardCharsets.UTF_8,MediaType.ALL);
    }

    @Override
    protected boolean supports(Class<?> aClass) {
        return true;
    }

    @Override
    protected Object readInternal(Class<?> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        return JSONObject.parseObject(StreamUtils.copyToString(httpInputMessage.getBody(), StandardCharsets.UTF_8),aClass);
    }

    @Override
    protected void writeInternal(Object o, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
        httpOutputMessage.getBody().write(JSONObject.toJSONBytes(o));
    }
}
           

 

WebConfig

@Configuration
public class WebConfig {

    @Resource
    private CustomHttpMessageConverter customHttpMessageConverter;

    @Bean
    public RestTemplate initRestTemplate(){
        RestTemplate restTemplate= new RestTemplate();
        restTemplate.getMessageConverters().set(5,customHttpMessageConverter);
                                            //使用自定义的消息转换器替换MappingJackson2HttpMessageConverter

        return restTemplate;
    }
}
           

 

restTemplate默认的消息转换器:restTemplate.getMessageConverters()

                      

springboot restTemplate 自定義消息轉換器

 

******************

controller 层

 

HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public Map<String,String> hello(){
        Map<String,String> params=new HashMap<>();
        params.put("name","瓜田李下");
        params.put("age","20");

        return params;
    }
}
           

 

Hello2Controller

@RestController
public class Hello2Controller {

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping("/test")
    public Person test(){
        return restTemplate.getForObject("http://localhost:8080/hello",Person.class);
    }
}
           

 

 

***********************

使用测试

 

localhost:8080/test

                        

springboot restTemplate 自定義消息轉換器

 

 

繼續閱讀