Skip to content

Commit 0d89cd2

Browse files
committed
自定义HttpMessageConverter
1 parent faecf4e commit 0d89cd2

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

src/main/java/com/chenfeng/xiaolyuh/config/MvcConfig.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.chenfeng.xiaolyuh.config;
22

3+
import java.util.List;
4+
35
import org.springframework.beans.factory.annotation.Autowired;
46
import org.springframework.context.annotation.Bean;
57
import org.springframework.context.annotation.ComponentScan;
68
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.http.converter.HttpMessageConverter;
710
import org.springframework.web.multipart.MultipartResolver;
811
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
912
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@@ -16,6 +19,7 @@
1619
import org.springframework.web.servlet.view.JstlView;
1720

1821
import com.chenfeng.xiaolyuh.interceptor.DemoInterceptor;
22+
import com.chenfeng.xiaolyuh.message.converter.MyHttpMessageConverter;
1923

2024
/**
2125
* MVC 配置类。这里我们配置了一个jsp的ViewResolver,用来映射路径和实际页面的位置,
@@ -72,6 +76,31 @@ public void addViewControllers(ViewControllerRegistry registry) {
7276
// 无任何业务逻辑只是简单的业务逻辑可以这样子写,代码更简洁,管理集中
7377
registry.addViewController("index2").setViewName("index");
7478
registry.addViewController("forUpload").setViewName("upload");
79+
registry.addViewController("converter").setViewName("converter");
80+
81+
}
82+
83+
@Bean
84+
public MyHttpMessageConverter converter() {
85+
return new MyHttpMessageConverter();
86+
}
87+
88+
/**
89+
* 覆盖掉Spring MVC默认注册的多个HttpMessageConverter
90+
*/
91+
@Override
92+
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
93+
94+
super.configureMessageConverters(converters);
95+
}
96+
97+
/**
98+
* 仅添加一个自定义的HttpMessageConverter,不覆盖默认的HttpMessageConverter
99+
*/
100+
@Override
101+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
102+
// 添加一个自定义的消息转换
103+
converters.add(converter());
75104
}
76105

77106
@Override
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.chenfeng.xiaolyuh.controller;
2+
3+
import org.springframework.stereotype.Controller;
4+
import org.springframework.web.bind.annotation.RequestBody;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.ResponseBody;
7+
8+
import com.chenfeng.xiaolyuh.entity.DemoObj;
9+
10+
11+
@Controller // 声明是一个控制器,并且返回时不需要@ResponseBody
12+
public class ConverterController {
13+
14+
@RequestMapping(value = "/convert", produces = { "application/x-wisely" })// 自定义的媒体类型
15+
@ResponseBody
16+
public DemoObj convert(@RequestBody DemoObj demoObj) {
17+
18+
return demoObj;
19+
}
20+
21+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.chenfeng.xiaolyuh.message.converter;
2+
3+
import java.io.IOException;
4+
import java.nio.charset.Charset;
5+
6+
import org.springframework.http.HttpInputMessage;
7+
import org.springframework.http.HttpOutputMessage;
8+
import org.springframework.http.MediaType;
9+
import org.springframework.http.converter.AbstractHttpMessageConverter;
10+
import org.springframework.http.converter.HttpMessageNotReadableException;
11+
import org.springframework.http.converter.HttpMessageNotWritableException;
12+
import org.springframework.util.StreamUtils;
13+
14+
import com.chenfeng.xiaolyuh.entity.DemoObj;
15+
16+
/**
17+
* 继承AbstractHttpMessageConverter类来实现自定义的HttpMessageConverter(消息转换器)
18+
*/
19+
public class MyHttpMessageConverter extends AbstractHttpMessageConverter<DemoObj> {
20+
21+
/**
22+
*
23+
* @Description 建立我们自定义的媒体类型"application/x-wisely"
24+
*/
25+
public MyHttpMessageConverter() {
26+
super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
27+
}
28+
29+
/**
30+
* 表明HttpMessageConverter(消息转换器)只处理DemoObj类
31+
*/
32+
@Override
33+
protected boolean supports(Class<?> clazz) {
34+
// 判断clazz类是不是DemoObj类或者是DemoObj的子类
35+
return DemoObj.class.isAssignableFrom(clazz);
36+
}
37+
38+
/**
39+
* 重写readInternal方法,处理请求数据。代码表明我们处理有“-”隔开的数据,并转成DemoObj对象
40+
*/
41+
@Override
42+
protected DemoObj readInternal(Class<? extends DemoObj> clazz, HttpInputMessage inputMessage)
43+
throws IOException, HttpMessageNotReadableException {
44+
45+
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
46+
String[] tempArr = temp.split("-");
47+
return new DemoObj(Long.parseLong(tempArr[0]), tempArr[1]);
48+
}
49+
50+
/**
51+
* 重写writeInternal方法,处理数据如何输出到response。此处,我么在原样输出前面加上“HELLO”
52+
*/
53+
@Override
54+
protected void writeInternal(DemoObj t, HttpOutputMessage outputMessage)
55+
throws IOException, HttpMessageNotWritableException {
56+
57+
String out = "HELLO:" + t.getId() + "-" + t.getName();
58+
outputMessage.getBody().write(out.getBytes());
59+
}
60+
61+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<%@ page language="java" contentType="text/html; charset=UTF-8"
2+
pageEncoding="UTF-8"%>
3+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4+
<html>
5+
<head>
6+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7+
<title>HttpMessageConverter Demo</title>
8+
</head>
9+
<body>
10+
<div id="resp"></div><input type="button" onclick="req();" value="请求"/>
11+
<script src="assets/js/jquery.js" type="text/javascript"></script>
12+
<script>
13+
function req(){
14+
$.ajax({
15+
url: "convert",
16+
data: "1-wangyunfei", //数据格式和自定义的消息转换器一致
17+
type:"POST",
18+
contentType:"application/x-wisely", //媒体类型和消息转换器的一致
19+
success: function(data){
20+
$("#resp").html(data);
21+
}
22+
});
23+
}
24+
25+
</script>
26+
</body>
27+
</html>

0 commit comments

Comments
 (0)