简介
SpringMVC 对对象实现序列化转换,在我看来不是很好用,而且比较鸡肋,因为需要使用 Ajax 的方式进行提交才会比较好用
实现步骤
- 新建 MessageConverter 类,继承 AbstractHttpMessageConverter 类,并添加如下代码;注意 User 实体类只有两个属性:username 和 password
public class MessageConverter extends AbstractHttpMessageConverter < User > {
public MessageConverter() {
// 构造方法中指明consumes(req)和produces(resp)的类型,指明这个类型才会使用这个converter
super(new MediaType("application", "x-user", Charset.forName("UTF-8")));
}
// 将字符串(a-b 格式)转化为对象
@Override
protected User readInternal(Class <? extends User > clazz, HttpInputMessage input) throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(input.getBody(), Charset.forName("UTF-8"));
String[] obj = temp.split("-");
return new User(obj[0], obj[1]);
}
@Override
protected boolean supports(Class <? > clazz) {
// 确定 user 类是否和 参数表示的类是否相同,或者是参数表示的类的父类
return User.class.isAssignableFrom(clazz);
}
// 将对象转化为字符串
@Override
protected void writeInternal(User user, HttpOutputMessage out) throws IOException, HttpMessageNotWritableException {
String temp = "hello: " + user.getUsername() + ", " + user.getPassword();
out.getBody().write(temp.getBytes());
}
}
- 在 SpringConfig 配置类中添加如下代码即可
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.review.springmvc")
public class SpringConfig extends WebMvcConfigurerAdapter {
// 添加转换器
@Override
public void extendMessageConverters(List < HttpMessageConverter <? >> converters) {
converters.add(new MessageConverter());
}
}
- 在 Controller 中,添加对应的方法
@PostMapping(value="/converter", produces={"application/x-user"})
@ResponseBody
public User convertUser(@RequestBody User user, Model model) {
return user;
}
- 在 index.jsp 中添加如下 js 代码,请求转换
<script>
$(function() {
$("#btn").click(function() {
$.ajax({
url: "http://localhost:8080/review_springMVC/converter",
data: "andy-123",
type: "POST",
contentType: "application/x-user",
success: function(data) {
console.log(data);
$("#message").html(data);
}
});
});
});
</script>
如果是 xml 的配置方式,添加如下配置即可
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.study.spring.converter.MessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>