十一、SpringBoot的类型转换

  • Post author:
  • Post category:其他


HttpMessageConverters

Spring MVC使用HttpMessageConverter接口转换HTTP请求和响应。合理的缺省值被包含的恰到好处(out of the box),例如对象可以自动转换为JSON(使用Jackson库)或XML(如果Jackson XML扩展可用则使用它,否则使用JAXB)。字符串默认使用UTF-8编码。

原理参考可参考:

http://blog.csdn.net/l_sail/article/details/70209845

如果需要添加或自定义转换器,你可以使用Spring Boot的HttpMessageConverters类:

定义一个 HttpMessageConverter

package com.lf.httpMessageConverter;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.lf.entity.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 org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.Charset;

/**
 * Created by LF on 2017/4/17.
 */

public class MyHttpMessageConverter extends AbstractHttpMessageConverter<User> {

    //自定义媒体类型
    public MyHttpMessageConverter() {
        super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
    }

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

    @Override
    protected User readInternal(Class<? extends User> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        String str = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
        return new User();
    }

    @Override
    protected void writeInternal(User user, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        String out = "hello:" + outputMessage.getBody();
        outputMessage.getBody().write(out.getBytes());
    }
}

实体类

package com.lf.entity;

/**
 * Created by LF on 2017/4/17.
 */
public class User {

    private int id;
    private String name;
    private boolean student;



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isStudent() {
        return student;
    }

    public void setStudent(boolean student) {
        this.student = student;
    }
}

配置HttpMessageConverter

@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {

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

package com.lf.config;

import com.lf.httpMessageConverter.MyHttpMessageConverter;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;

/**
 * Created by LF on 2017/4/17.
 */
@Configuration
public class MyConfiguration {



    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter additional = new MyHttpMessageConverter();
        return new HttpMessageConverters(additional);
    }
}

两种方法都可以。

任何在上下文中出现的HttpMessageConverter bean将会添加到converters列表,你可以通过这种方式覆盖默认的转换器(converters)。

controller

package com.lf.web;

import com.lf.entity.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by LF on 2017/4/17.
 */
@RestController
public class IndexController {

    @RequestMapping(value = "/index", method = RequestMethod.POST)
    public User index(@RequestBody User user) {
        return user;
    }
}



版权声明:本文为L_Sail原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。