十一、SpringBoot的类型转换

来源:互联网 发布:aaa服务器 windows 编辑:程序博客网 时间:2024/06/07 10:55

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

@Configurationpublic 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. */@Configurationpublic 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. */@RestControllerpublic class IndexController {    @RequestMapping(value = "/index", method = RequestMethod.POST)    public User index(@RequestBody User user) {        return user;    }}
0 0
原创粉丝点击