Spring实现之HttpMessageConverter
因为给朋友些教程,我就在想写点啥,能够慢慢的,不经意间,叫他学会JAVA,他和我一样都是其他语言过来的,我不希望他只是做添加删除那样低级而无味的事情,我就在想以至于今天到现在没有憋出来一个教程,当我看我写的源码的时候我突然想到了,昨天我使用了一个文本原样输出,@ResponseBody
,今天咱们就学学这个的根基。
我们平时做项目的时候经常碰见XML
,JSON
格式,这些格式spring是如何支持的,估计很多小伙伴不知道,或者曾经知道吧!不管什么语言我觉得好奇心是好的,应该有足够的好奇心没有学不会的东西。
目前市面常见类型
看着这么多风骚的类型,我们是不是实现一个类型?下边我们实现一个application-liujunying
实现自定义响应步骤
①继承AbstractHttpMessageConverter
②实现supports
,readInternal
,writeInternal
③注册自己实现的类
编写自定义类型
AbstractHttpMessageConverter
继承与HttpMessageConverter
他帮助我们接收处理以及输出数据。
package com.haojishu.demo.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.haojishu.demo.domain.Sulwan;
public class SulwanMessageConverter extends AbstractHttpMessageConverter<Sulwan>{
@Override
protected boolean supports(Class<?> clazz) {
return Sulwan.class.isAssignableFrom(clazz);
}
@Override
protected Sulwan readInternal(Class<? extends Sulwan> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
return new Sulwan(temp);// 在实现逻辑哪里去输出你想要的形状
}
@Override
protected void writeInternal(Sulwan t, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
// 这里去实现要返回的逻辑
}
public SulwanMessageConverter() {
super(new MediaType("application", "x-sulwan", Charset.forName("UTF-8")));
}
}
注册你的类型
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
public SulwanMessageConverter converter() {
return new SulwanMessageConverter();
}
使用自定义类型
@RequestMapping(value="/convert", produces = {"application/x-sulwan"})
@ResponseBody
public Sulwan convert(@RequestBody String useranme) {
return new Sulwan(useranme);
}
到底干啥用的
这个是从响应类型层面去处理你的东西,我们比如输出JSON
类型给APP
的时候经常使用的FASTJSON
就是用这个机制实现的,当然我们说我们也可以直接封装到一个实体类,完后返回也是可以的,或者使用AOP
环通知也是可以实现的,那些我们下次讲解!
网友评论