spring boot之spring mvc常用配置--自定义HtppMessageConverter(9)

HttpmessageConvert是用来处理request和response里的数据的。Spring为我们内置了大量的HttpmessageConvert,
例如,MappingJackson2HttpMessageConverter/StringHttpMessageConverter等。

1.继承AbstractHttpMessageConverter实现自定义的HttpMessageConverter

package com.boot.springmvc.messageconvert;

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.boot.springmvc.domain.DemoObj;

public class MymessageConverter extends AbstractHttpMessageConverter<DemoObj> {// 1继承AbstractHttpMessageConverter实现自定义的HttpMessageConverter

	public MymessageConverter() {
		super(new MediaType("application", "blog-zh", Charset.forName("UTF-8")));// 2构造函数中我们自定义媒体类型(application/blog-zh)
	}

	// 3重写readInternal方法,处理请求数据。
	@Override
	protected DemoObj readInternal(Class<? extends DemoObj> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
		String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
		String[] tempArr = temp.split("-");
		return new DemoObj(new Long(tempArr[0]), tempArr[1]);
	}

	// 4HttpMessageConverter只处理DemoObj这个类
	@Override
	protected boolean supports(Class<?> clazz) {
		return DemoObj.class.isAssignableFrom(clazz);
	}

	// 5处理response响应的数据。
	@Override
	protected void writeInternal(DemoObj t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
		String out="hello"+t.getId()+"-"+t.getName();
		outputMessage.getBody().write(out.getBytes());
	}

}

2.MyMvcConfig配置

/**
	 * 配置自定义的HttpMessageConverter
	 *注:
	 *1.configureMessageConverters:重载会覆盖掉spring mvc默认注册的 多个HttpMessageConverter。
	 *2.extendsMessageConverter:仅添加一个自定义 的HttpMessageConverter,不覆盖默认注册 的HttpMessageConverter.
	 **/
	//使用extendsMessageConverter 添加一个自定义的HttpMessageConverter
	@Bean
	public MymessageConverter converter(){
		return new MymessageConverter();
	}
	
	@Override
	public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		converters.add(converter());
	}

addviewControllers配置如下

// 演示HttpMessageConverter
registry.addViewController("/converter").setViewName("/converter");

3.控制器配置如下

package com.boot.springmvc.web.ch4;

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.boot.springmvc.domain.DemoObj;

@Controller
public class ConverterController {
	@RequestMapping(value = "/convert", produces = { "application/blog-zh" }) // 1
	public @ResponseBody DemoObj convert(@RequestBody DemoObj demoObj) {
		return demoObj;
	}

}

4.jsp配置

<%@ 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>HttpMessageConverter Demo</title>
</head>
<body>
    <div id="resp"></div><input type="button" onclick="req();" value="请求"/>
<script src="/assets/js/jquery.js" type="text/javascript"></script>
<script>
    function req(){
        $.ajax({
            url: "convert",
            data: "1-blog", //1
            type:"POST",
            contentType:"application/blog-zh", //2
            success: function(data){
                $("#resp").html(data);
            }
        });
    }

</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/z3133464733/article/details/79304447