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 版权协议,转载请附上原文出处链接和本声明。