Spring就是一个大大的插线板,上面插着各种各样的Bean。

SpringBoot大大简化了Spring的配置,将原来放在XML中的配置大量的在代码中使用注解实现。这么做有利有弊,总体上利大于弊。

使用注解的方式在Spring中注册Bean,有四种方式:

  • Component
  • Service
  • Controller,RestController
  • Repository

上面这四个注解真是SpringBoot的核心。因为要想使用

  • @Value属性注入
  • @Resource,@Autowired自动注入

就必须让Spring能够看见使用这些注解的类,也就是说必须在Spring中注册Bean,Spring才会统一帮你管理。

上面“Component”等注解都是用来注解类,注解接口要使用@Bean注解。当让Spring注入接口时,如果接口有多个实例类,需要用@Resource("myUserDaoImpl")这种方式注明实例类的名称;如果接口只有一个实例类,Spring会自动检测合适的类型进行注入。

没有Spring的时候,各个Bean形成的依赖关系是一个错综复杂的图状结构。有了Spring,各个Bean之间松耦合,各个Bean只跟Spring容器有联系,这就形成了总线型的依赖,大大简化了类与类之间的依赖关系。

下面进入正题,我编写了一个Controller,返回User类型的数据,Spring会把User转化成JSON字符串,现在我想对这个字符串进行一些处理再返回。要求不能更改Controller部分的代码,因为我要对全部的返回的JSON都进行这种处理,如果改Controller的话需要更改好多地方。

@RestController
class MyController {
@RequestMapping("user")
User getUser() {
return new User("weidiao", 25);
}
}

虽然这个函数返回的User类型,实际上Spring会把这个对象转换成JSON。跟@ResponseBody@RequestBody两个注解密切相关的一个接口是:HttpMessageConverter。

消息转换器的目标是:HTTP输入请求格式向Java对象的转换;Java对象向HTTP输出请求的转换。有的消息转换器只支持多个数据类型,有的只支持多个输出格式,还有的两者兼备。

HttpMessageConverter 接口提供了5个方法:

  • canRead :判断该转换器是否能将请求内容转换成Java对象
  • canWrite :判断该转换器是否可以将Java对象转换成返回内容
  • getSupportedMediaTypes :获得该转换器支持的MediaType类型
  • read :读取请求内容并转换成Java对象
  • write :将Java对象转换后写入返回内容

其中 read 和 write 方法的参数分别有有 HttpInputMessage 和 HttpOutputMessage 对象,这两个对象分别代表着一次Http通讯中的请求和响应部分,可以通过 getBody 方法获得对应的输入流和输出流。

Spring已经默认包含了常用的消息转换器:

名称 作用 读支持MediaType 写支持MediaType
ByteArrayHttpMessageConverter 数据与字节数组的相互转换 / application/octet-stream
StringHttpMessageConverter 数据与String类型的相互转换 text/* text/plain
FormHttpMessageConverter 表单与MultiValueMap<string, string=””>的相互转换 application/x-www-form-urlencoded application/x-www-form-urlencoded
SourceHttpMessageConverter 数据与javax.xml.transform.Source的相互转换 text/xml和application/xml text/xml和application/xml
MarshallingHttpMessageConverter 使用Spring的Marshaller/Unmarshaller转换XML数据 text/xml和application/xml text/xml和application/xml
MappingJackson2HttpMessageConverter 使用Jackson的ObjectMapper转换Json数据 application/json application/json
MappingJackson2XmlHttpMessageConverter 使用Jackson的XmlMapper转换XML数据 application/xml application/xml
BufferedImageHttpMessageConverter 数据与java.awt.image.BufferedImage的相互转换 Java I/O API支持的所有类型 Java I/O API支持的所有类型

请看实现

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.stereotype.Component; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List; @Component
public class MyHttpMessageConverter implements HttpMessageConverter<Object> {
@Override
public boolean canRead(Class<?> aClass, MediaType mediaType) {
return false;
} @Override
public boolean canWrite(Class<?> aClass, MediaType mediaType) {
return true;
} @Override
public List<MediaType> getSupportedMediaTypes() {
return Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8);
} @Override
public Object read(Class<?> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
return null;
} @Override
public void write(Object o, MediaType mediaType, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
PrintWriter cout = new PrintWriter(httpOutputMessage.getBody());
JSONObject ans = new JSONObject();
ans.put("object", o);
ans.put("successful", o != null);
cout.write(JSON.toJSONString(ans, true));
cout.close();
}
}

使用@Component注解这个类就能够让Spring知道:这里有一个消息转换器。这样Spring就会使用它。

SpringBoot自定义HttpMessageConverter的更多相关文章

  1. SpringBoot自定义拦截器实现IP白名单功能

    SpringBoot自定义拦截器实现IP白名单功能 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/8993331.html 首先,相关功能已经上线了,且先让我先 ...

  2. SpringBoot自定义错误信息,SpringBoot适配Ajax请求

    SpringBoot自定义错误信息,SpringBoot自定义异常处理类, SpringBoot异常结果处理适配页面及Ajax请求, SpringBoot适配Ajax请求 ============== ...

  3. SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面

    SpringBoot自定义错误页面,SpringBoot 404.500错误提示页面 SpringBoot 4xx.html.5xx.html错误提示页面 ====================== ...

  4. springboot自定义错误页面

    springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { re ...

  5. SpringBoot自定义Filter

    SpringBoot自定义Filter SpringBoot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,当然我们可以自定 义F ...

  6. springboot 自定义LocaleResolver切换语言

    springboot 自定义LocaleResolver切换语言 我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboor中 ...

  7. SpringMVC拦截器与SpringBoot自定义拦截器

    首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...

  8. [技术博客] SPRINGBOOT自定义注解

    SPRINGBOOT自定义注解 在springboot中,有各种各样的注解,这些注解能够简化我们的配置,提高开发效率.一般来说,springboot提供的注解已经佷丰富了,但如果我们想针对某个特定情景 ...

  9. 08点睛Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)

    8.1 配置 Spring MVC的配置是通过继承WebMvcConfigurerAdapter类并重载其方法实现的; 前几个教程已做了得配置包括 01点睛Spring MVC 4.1-搭建环境 配置 ...

随机推荐

  1. 如何查看openshift Router的metrics

    先找到用户名和密码 [root@master ~]# oc describe pod router--8pjrb | grep STATS_ STATS_PASSWORD: mFj58DpaOQ ST ...

  2. 开启hadoop和Hbase集群的lzo压缩功能(转)

    原文链接:开启hadoop和Hbase集群的lzo压缩功能 问题导读: 1.如何启动hadoop.hbase集群的压缩功能? 2.lzo的作用是什么? 3.hadoop配置文件需要做哪些修改? 首先我 ...

  3. @SpringContext通过实现ApplicationContextAware接口动态获取bean

    场景: 在代码中需要动态获取spring管理的bean 目前遇到的主要有两种场景:1.在工具类中需要调用某一个Service完成某一个功能,如DictUtils2.在实现了Runnable接口的任务类 ...

  4. 第四章 四种List实现类的对比总结

    1.ArrayList 非线程安全 基于对象数组 get(int index)不需要遍历数组,速度快: iterator()方法中调用了get(int index),所以速度也快 set(int in ...

  5. eclipse maven 报错Could not get the value for parameter encoding for plugin execution default

    问题描述:更改默认的maven仓库路径完成后.即存maven项目或者新建maven项目的时候出现如下错误 Could not get the value for parameter encoding ...

  6. ASP 未结束的字符串常量

    之前的电脑是XP的,前段时间公司将电脑升级到了Windows7 今天在处理一个asp项目时发现打开就报错了"未结束的字符串常量" 在网络上了解到是因为编码的问题,但我的项目文件都是 ...

  7. Oracle密码过期设置和修改密码问题

    Oracle密码过期设置和修改密码问题 学习了:https://jingyan.baidu.com/article/ce09321b5608612bff858ff3.html sqlplus / as ...

  8. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法

    如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...

  9. linux安装scikit-learn

    原文:http://www.cnblogs.com/cyttina/archive/2013/06/08/3127345.html ubuntu的看官方的文档就好了. http://scikit-le ...

  10. JSP基本的语法、3个编译指令、7个动作指令、9个内置对象

    一.jsp概述 JSP是java server page的缩写,其本质是一个简化的servlet,是一种动态网页技术标准.jsp页面是在HTML页面中嵌入java程序段.使用jsp开发的应用程序能够跨 ...