千家信息网

Spring接口支持返回多种格式的方法

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇内容介绍了"Spring接口支持返回多种格式的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2025年11月07日Spring接口支持返回多种格式的方法

本篇内容介绍了"Spring接口支持返回多种格式的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 简介

本文介绍使用SpringMVC的后端服务如何通过配置来支持多种返回值类型(xml,json,html,excel)

2. 基础概念

2.1 HttpHeader中Content-Type和Accept设置的区别

Accept:接口要返回给客户端的数据格式

1curl --header 'Accept:application/json' http://localhost:8080/todo

Content-Type:客户端发送给服务器端的数据格式

1curl -X PUT --header 'Content-Type:application/json' -d '{"title":"周末日程","content":"睡觉"}' http://localhost:8080/todo

2.2 SpringMVC生成输出的两种方式

1) 当服务端使用Restful的方式,只为客户端的ajax或其他服务端请求提供数据时,通常会使用@ResponseBody来标识你的返回,这时候Spring使用HttpMessageConverter来把返回的对象格式化成所需的格式。

2) 当你需要提供表现层(比如:HTML),这时候SpringMVC使用ViewResolver来将处理你的返回。

有时候你的应用程序这两者都要提供

2.3 SpringMVC输出格式判定

很多时候为了支持多个系统或多个终端,你需要让相同的数据已不同的表现形式输出。

SpringMVC使用ContentNegotationStrategy来判定用户请求希望得到什么格式的数据。

ContentNegotationStrategy通过三种方式来识别用户想要返回什么样的数据

通过请求URL后缀:http://myserver/myapp/accounts/list.html 返回html格式

通过请求的参数:http://myserver/myapp/accounts/list?format=xls 该设置默认不开启,默认key是format。

通过HTTP Header的Accept:Accept:application/xml 优先级由上至下

请看如下配置

@Override

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {

configurer.favorPathExtension(false)

.favorParameter(true)

.parameterName("mediaType")

.defaultContentType(MediaType.APPLICATION_JSON)

.mediaType("xml", MediaType.APPLICATION_XML)

.mediaType("html", MediaType.TEXT_HTML)

.mediaType("json", MediaType.APPLICATION_JSON);

}

在你工程的WebMvcConfig中加入以上配置,表示关闭URL后缀的规则,打开请求参数规则并设置请求参数为’mediaType’,默认的返回格式是json,还支持返回xml,html。

这三个组件是用来处理返回不同格式输出的关键

Request Mappings: 决定不同的请求到不同的方法并返回不同的格式.

View Resolution: 根据类型返回合适的表示层.

HttpMessageConverters: 将request中的参数转换成java对象,将java对象转换成相应的输出格式到response.

2.4 RequestMappings

2.4.1 RequestMappingHandlerMapping

我们在spring中通常使用的就是RequestMappingHandlerMapping,根据RequestMappingInfo,细化匹配条件,整体的查找过程如下:

AbstractHandlerMethodMapping实现接口getHandlerInternal

1. 使用UrlPathHelper查找request对应的path

2. 查找path对应的HandlerMethod

2.1 从urlMap中直接等值匹配查找匹配条件RequestMappingInfo

2.2 如果等值查找到匹配条件,将其添加到match条件中

2.3 如果没有找到匹配条件,使用所有的handlerMethod的RequestMappingInfo进行匹配

2.4 对匹配到的Match进行排序,取出最高优先级的Match,并核对是否是唯一的最高优先级

2.5 对匹配到条件,没有匹配到条件的两种情况,分别进行封装

3. 封装HandlerMethod,确保bean中存的是实例    ContentNegotiationManager其中提供了针对miniType的match条件比较,使框架可以匹配到最合适的处理方法。

2.5 HttpMessageConverter

2.5.1 The Default Message Converters

SpringMvc默认会加载下列HttpMessageConverters:

ByteArrayHttpMessageConverter – converts byte arrays

StringHttpMessageConverter – converts Strings

ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream

SourceHttpMessageConverter – converts javax.xml.transform.Source

FormHttpMessageConverter – converts form data to/from a MultiValueMap.

Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath)

MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath)

MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath)

AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath)

RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)

我们如果返回的是使用@ResponseBody来标识的,那么框架会使用HttpMessageConverter来处理返回值,默认的xmlCoverter不是特别好用,依赖返回实体对象上的@XmlRootElement注解,不是很方便所以引入辅助类库,并自定义MessageConverter这样可以直接将返回的对象处理成xml格式。

Gradle import library

compile group: 'org.springframework', name: 'spring-oxm', version: '4.3.9.RELEASE'

compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.10'

configuration

@Override

public void configureMessageConverters(List> converters) {

converters.add(createXmlHttpMessageConverter());

super.configureMessageConverters(converters);

}

private HttpMessageConverter createXmlHttpMessageConverter() {

MarshallingHttpMessageConverter xmlConverter =

new MarshallingHttpMessageConverter();

XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();

xmlConverter.setMarshaller(xstreamMarshaller);

xmlConverter.setUnmarshaller(xstreamMarshaller);

return xmlConverter;

}

2.6 View Resolution

2.6.1 页面render(freemarker)

当需要返回页面时就需要由合适的viewResolver来绘制画面,这里采用freemarker作为页面引擎。

Gradle import library

1compile("org.springframework.boot:spring-boot-starter-freemarker")

"Spring接口支持返回多种格式的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

格式 条件 数据 输出 支持 不同 对象 处理 接口 方法 参数 服务 多种 合适 优先级 客户 方式 端的 页面 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 5g时代网络安全面临的新挑战 沭阳工业网络技术保养 什么是数据库的系统 国家小学网络安全平台 数据库导出工具 如何判断数据库设计 九九七八八网络技术有限公司 德惠智能化网络技术服务有哪些 主要的网络安全措施和技术包括 深圳零壹互联网科技有限公司产品 海南鸿泰翔网络技术有限公司 服务器维保服务 中国网传播有限公司网络安全 省网络安全与信息化条例 怎么查看建立的数据库是不是系统 华为服务器uc4报错 计算机网络技术和软件应用 如何用易语言收集数据库 广东计算机一级考试网络技术 测绘内业数据库系统的设计与研发 怎么设置数据库远程访问 计算机软件开发英文 ipv6网络安全的政策 服务器连接不上体验服 网络安全日活动说明 中国药智数据库 爱的软件开发公司在哪里 数据库硬删除是彻底删除吗 安徽企业网络技术咨询简介 测绘内业数据库系统的设计与研发
0