MessageConverter作用是读取request中body的数据并进行转换,并将转换后的数据经过处理后写入response的body中。在配置类中添加MessageConverter的方法有两种:
extendMessageConverters(List
1. MessageConverter
package com.messageconverter;
import java.io.IOException;
import java.nio.charset.Charset;
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 com.object.DemoObj;
public class DemoMessageConverter extends AbstractHttpMessageConverter<DemoObj> {
/**define a new MediaType, which also can be done by invoking setSupportedMediaTypes method.
* The former is constructor injection, the latter is setter injection.
*
*/
public DemoMessageConverter() {
super(new MediaType(
"application", "xxx-apple", Charset.forName("UTF-8")));
}
/** 从request的body中读取数据,并转换为DemoObj
* @param clazz
* @param inputMessage
* @return
* @throws IOException
* @throws HttpMessageNotReadableException
*/
@Override
protected DemoObj readInternal(Class<? extends DemoObj> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(),
Charset.forName("UTF-8"));
String strArr[] = temp.split("-"); // Acquire that the data String is contacted by "-"
return new DemoObj(Long.valueOf(strArr[0]), strArr[1]);
}
/** 确定给定的类(即DemoObj)被该MessageConverter支持
* @param clazz
* @return
*/
@Override
protected boolean supports(Class<?> clazz) {
return DemoObj.class.isAssignableFrom(clazz);
}
/**将DemoObj对象写入response的body中
* @param t
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
*/
@Override
protected void writeInternal(DemoObj t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String output = "Hello: " + t.getId() + "-" + t.getName();
outputMessage.getBody().write(output.getBytes());
}
}
2. 配置类中增加MessageConverter
package com.config;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
import com.interceptor.DemoInterceptor;
import com.messageconverter.DemoMessageConverter;
@Configuration
@ComponentScan("com")
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
@Bean
InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver =
new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/classes/views/");
viewResolver.setSuffix(".jsp");
//JstlView is used to support java standard tag library and create jsp view
viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
@Bean
DemoInterceptor demoInterceptor() {
return new DemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor());
}
@Override
public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/viewController").setViewName("viewController");
// file upload test url-view mapping
registry.addViewController("/toUpload").setViewName("/upload");
// MessageConverter test url-view mapping
registry.addViewController("/converter").setViewName("/converter");
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(1000000);
return multipartResolver;
}
@Bean
public DemoMessageConverter demoMessageConverter() {
return new DemoMessageConverter();
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(demoMessageConverter());
}
}
3. Controller
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.object.DemoObj;
@Controller
public class ConverterController {
@RequestMapping(value="/convert", produces= {"application/xxx-apple"})
@ResponseBody
public DemoObj convert(@RequestBody DemoObj obj) {
Long id = obj.getId() + 1;
String name = obj.getName() + "macbook";
return new DemoObj(id, name);
}
}
4. JSP for test
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="resp"></div>
<input type="button" onclick="req();" value="请求"/>
<script src="assets/js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script>
function req() {
$.ajax({
url: "convert",
data: "1-apple",
type: "POST",
contentType: "application/xxx-apple",
success: function(data) {
$("#resp").html(data);
}
});
}
</script>
</body>
</html>
5. Test result
通过ajax发送的数据“1-apple”经过MessageConverter后返回到jsp页面变成:
Hello: 2-applemacbook
试验成功。