返回顶部
首页 > 资讯 > 精选 >Spring Boot数据响应问题实例分析
  • 281
分享到

Spring Boot数据响应问题实例分析

2023-06-29 12:06:57 281人浏览 独家记忆
摘要

本文小编为大家详细介绍“spring Boot数据响应问题实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot数据响应问题实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习

本文小编为大家详细介绍“spring Boot数据响应问题实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot数据响应问题实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    前言

    响应页面指的是我们如何发送一个请求,跳转到指定页面。将会在后面的视图解析中说明。 响应页面常见于开发单体应用。 响应数据常见于开发前后端分离的应用。后端代码主要用来接收请求。前端页面给我们发送过来请求,给前端响应JSON数据。或者给前端响应xml、图片、音视频数据。

    在前后端分离开发过程中,后端一般会将数据集封装成一个jsON对象响应给前端 ,一般只需要标准ResponseBody即可给前端返回数据

    1、响应Json数据:Jackson.jar+@ResponseBody

    假设给前端自动返回json数据,需要引入相关的依赖

    <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-WEB</artifactId></dependency><!-- web场景自动引入了json场景 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-json</artifactId>    <version>2.3.4.RELEASE</version>    <scope>compile</scope></dependency>

    控制层代码如下:引入了依赖后,给方法上标注@ResponseBody,就可以给前端自动返回JSON数据。

    @Controllerpublic class ResponseTestController {    @ResponseBody //原理就是利用返回值处理器里面消息转换器进行处理    @GetMapping("/test/person")    public Person getPerson(){        Person person = new Person();        person.setAge(28);        person.setBirth(new Date());        person.setUserName("zhangsan");        return person;    }}

    测试

    Spring Boot数据响应问题实例分析

    2、原理解析

    • 返回值处理器判断是否支持这种类型返回值supportsReturnType

    • 返回值处理器调用handleReturnValue进行处理

    • RequestResponseBodyMethodProcessor可以处理返回值标了@ResponseBody注解的。

      • 内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)

      • 服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,

      • springMVC会挨个遍历所有容器底层的HttpMessageConverter,看谁能处理?(也就是把对象转换成为json数据)

      • 得到MappingJackson2HttpMessageConverter消息转换器可以将对象写为json

      • 利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

      • 利用MessageConverters进行处理将数据写为json

    SpringMVC到底支持哪些返回值

    • ModelAndView //包含数据和页面

    • Model

    • View

    • ResponseEntity

    • ResponseBodyEmitter

    • StreamingResponseBody

    • HttpEntity

    • HttpHeaders

    • Callable //异步

    • DeferredResult

    • ListenableFuture

    • CompletionStage

    • WebAsyncTask

    • 有 @ModelAttribute 且为对象类型的

    • @ResponseBody 注解 ---> RequestResponseBodyMethodProcessor;处理器//即在方法上或者类上是否标注@ResponseBody

    HTTPMessageConverter原理

    MessageConverter规范

    Spring Boot数据响应问题实例分析

    HttpMessageConverter:看是否支持将 此 Class类型的对象,转为MediaType类型的数据。 例子:CanWrite将Person对象转为JSON。canRead或者 JSON转为Person

    默认的MessageConverter

    Spring Boot数据响应问题实例分析

    • 0 - 只支持Byte类型的

    • 1 - String

    • 2 - String

    • 3 - Resource

    • 4 - ResourceRegion

    • 5 - DOMSource.class \ SAXSource.class) \ StAXSource.class \StreamSource.class \Source.class

    • 6 - MultiValueMap

    • 7 - true //支持将任意对象转为指定的,不管是什么都支持

    • 8 - true

    • 9 - 支持注解方式xml处理的。

    最终 MappingJackson2HttpMessageConverter 把对象转为JSON(利用底层的jackson的objectMapper转换的)

    3、内容协商

    3.1、概述

    根据客户端接收能力不同【有的只接收xml,有的只接收json】,返回不同媒体类型的数据。比如返回xml数据给前

    引入支持XML依赖:

    <dependency>    <groupId>com.fasterxml.jackson.datafORMat</groupId>    <artifactId>jackson-dataformat-xml</artifactId></dependency>

    重新编译该项目运行 ,返回了xml数据

    Spring Boot数据响应问题实例分析

    3.2、postman分别测试返回json和xml

    在上面的测试中,此时如果我用postman发送相同的请求,则得到的是json数据,为啥同样的请求,方式不一样,返回的数据不一样呢。原因就是请求头中规定的数据响应先后顺序

    查看请求头

    Spring Boot数据响应问题实例分析

    内容协商Accept中,浏览器具备什么类型数据的接收能力,可以看到xml数据是优先被接收的。

    可用Postman软件分别测试返回json和xml:只需要改变请求头中Accept字段(application/json、application/xml)。Http协议中规定的,告诉服务器本客户端可以接收的数据类型

    Spring Boot数据响应问题实例分析

    3.3、开启浏览器参数方式内容协商功能

    为了方便内容协商,开启基于请求参数的内容协商功能。

    spring:    contentneGotiation:      favor-parameter: true  #开启请求参数内容协商模式

    发请求:

    • json类型: http://localhost:8080/test/person?format=json

    • xml类型:http://localhost:8080/test/person?format=xml

    确定客户端接收什么样的内容类型;

    Parameter策略优先确定是要返回json数据(获取请求头中的format的值) 2、最终进行内容协商返回给客户端json即可。

    4、内容协商原理

    • 判断当前响应头中是否已经有确定的媒体类型。MediaType

    • 获取客户端(PostMan、浏览器)支持接收的内容类型。(获取客户端Accept请求头字段)【application/xml】

    • contentNegotiationManager 内容协商管理器 默认使用基于请求头的策略

    • HeaderContentNegotiationStrategy 确定客户端可以接收的内容类型

    • 遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象(Person)

    • 找到支持操作Person的converter,把converter支持的媒体类型统计出来。

    • 客户端需要【application/xml】。服务端能力【10种、json、xml】

    • 进行内容协商的最佳匹配媒体类型

    • 用 支持 将对象转为 最佳匹配媒体类型 的converter。调用它进行转化 。

    导入了jackson处理xml的包,xml的converter就会自动进来

    WebmvcConfigurationSupportjackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);if (jackson2XmlPresent) {                    Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();                    if (this.applicationContext != null) {                            builder.applicationContext(this.applicationContext);                    }                    messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));            }

    5、自定义消息转换器MessageConverter

    5.1、概述

    实现多协议数据兼容。json、xml、x-guigu

    • @ResponseBody 响应数据出去 调用 RequestResponseBodyMethodProcessor 处理

    • Processor 处理方法返回值。通过 MessageConverter 处理

    • 所有 MessageConverter 合起来可以支持各种媒体类型数据的操作(读、写)

    • 内容协商找到最终的 messageConverter;

    要自定义SpringMVC的什么功能,即通过一个入口给容器中添加一个 WebMvcConfigurer

    假设你想基于自定义请求参数的自定义内容协商功能。换句话,在地址栏输入http://localhost:8080/test/person?format=gg返回数据,跟http://localhost:8080/test/person且请求头参数`Accept:application/x-guigu`的返回自定义协议数据的一致。

    演示

    通过上文分析,我们只需要实现WebMvcConfigurer接口,并实现了configureMessageConverters方法,就可以达到自定义消息转换器的目的。例如,我不想用jackson了,想用fastjson的消息转换器,我们可以添加fastjson相关的MessageConverter就可以了

    @Configurationpublic class WebConfig implements WebMvcConfigurer {    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();        List<MediaType> fastMediaTypes = new ArrayList<>();        fastMediaTypes.add(MediaType.TEXT_html);        fastMediaTypes.add(MediaType.APPLICATION_JSON);        fastConverter.setSupportedMediaTypes(fastMediaTypes);        FastJsonConfig fastJsonConfig = new FastJsonConfig();        fastJsonConfig.setSerializerFeatures(            SerializerFeature.WriteMapNullValue,            SerializerFeature.WriteNullStringAsEmpty,            SerializerFeature.WriteNullListAsEmpty,            SerializerFeature.WriteDateUseDateFormat);        SerializeConfig serializeConfig = SerializeConfig.globalInstance;        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);        serializeConfig.put(Long.class, ToStringSerializer.instance);        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);        fastJsonConfig.setSerializeConfig(serializeConfig);        fastConverter.setFastJsonConfig(fastJsonConfig);        converters.add(fastConverter);    }}

    测试

    @Datapublic class Person {    private String userName;    private Integer age;    //使用fastjson的注解进行转换    @JSONField(format = "yyyy-MM-dd")    private Date birth;    private Pet pet;}

    Spring Boot数据响应问题实例分析

    5.2、自定义的Converter

    除此之外,这些都是默认的,我们可以进行扩展,如下实现自定义的设置转化,如下,利用这个代码:

    @Beanpublic WebMvcConfigurer webMvcConfigurer(){    return new WebMvcConfigurer() {        @Override        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {        }    }}

    测试

    @Configuration(proxyBeanMethods = false)public class WebConfig {    @Bean    public WebMvcConfigurer webMvcConfigurer(){        return new WebMvcConfigurer() {            @Override            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {                converters.add(new GuiguMessageConverter());            }        }    }}
    public class GuiguMessageConverter implements HttpMessageConverter<Person> {    @Override    public boolean canRead(Class<?> clazz, MediaType mediaType) {        return false;    }    @Override    public boolean canWrite(Class<?> clazz, MediaType mediaType) {        return clazz.isAssignableFrom(Person.class);    }        @Override    public List<MediaType> getSupportedMediaTypes() {        return MediaType.parseMediaTypes("application/x-guigu");    }    @Override    public Person read(Class<? extends Person> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {        return null;    }    @Override    public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {        //自定义协议数据的写出        String data = person.getUserName()+";"+person.getAge()+";"+person.getBirth();        //写出去        OutputStream body = outputMessage.getBody();        body.write(data.getBytes());    }}

    测试:

    import java.util.Date;@Controllerpublic class ResponseTestController {        @ResponseBody  //利用返回值处理器里面的消息转换器进行处理    @GetMapping(value = "/test/person")    public Person getPerson(){        Person person = new Person();        person.setAge(28);        person.setBirth(new Date());        person.setUserName("zhangsan");        return person;    }}

    日后开发要注意,有可能我们添加的自定义的功能会覆盖默认很多功能,导致一些默认的功能失效。

    读到这里,这篇“Spring Boot数据响应问题实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Spring Boot数据响应问题实例分析

    本文链接: https://lsjlt.com/news/324732.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Spring Boot数据响应问题实例分析
      本文小编为大家详细介绍“Spring Boot数据响应问题实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot数据响应问题实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
      99+
      2023-06-29
    • Spring Boot数据响应问题实例详解
      目录前言1、响应Json数据:Jackson.jar+@ResponseBody2、原理解析3、内容协商3.1、概述3.2、postman分别测试返回json和xml3.3、开启浏览...
      99+
      2024-04-02
    • Java SpringMVC数据响应实例分析
      这篇文章主要介绍“Java SpringMVC数据响应实例分析”,在日常操作中,相信很多人在Java SpringMVC数据响应实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
      99+
      2023-06-29
    • Spring响应式编程实例分析
      今天小编给大家分享一下Spring响应式编程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 前言了解响应式编程,...
      99+
      2023-07-02
    • SpringCloudGateway拦截响应问题分析(数据截断问题)
      Spring Cloud Gateway是Spring 官方基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关,Spring C...
      99+
      2023-01-07
      Spring Cloud Gateway 拦截响应 Spring Cloud 数据截断 Spring Cloud Gateway 拦截
    • Spring Boot多数据源处理事务实例分析
      这篇“Spring Boot多数据源处理事务实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&n...
      99+
      2023-06-30
    • Spring Boot Starters使用实例分析
      本篇内容主要讲解“Spring Boot Starters使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot Starters使用...
      99+
      2024-04-02
    • Spring Boot应用开发的示例分析
      这篇文章主要介绍了Spring Boot应用开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring Boot是由Pivotal团队提供的全新Spring开发...
      99+
      2023-06-20
    • Spring Boot配置文件实例分析
      今天小编给大家分享一下Spring Boot配置文件实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2024-04-02
    • Spring Boot底层原理实例分析
      这篇“Spring Boot底层原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
      99+
      2023-06-29
    • Spring Boot结合P6Spy的实例分析
      这篇文章给大家介绍Spring Boot结合P6Spy的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一:pom.xml 中添加依赖<dependency><groupId>p6spy&...
      99+
      2023-06-05
    • spring boot使用thymeleaf版本的问题分析
      本篇内容介绍了“spring boot使用thymeleaf版本的问题分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!spring boo...
      99+
      2023-06-20
    • Vue数据响应式原理实例代码分析
      本文小编为大家详细介绍“Vue数据响应式原理实例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据响应式原理实例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。改造数据我们先来尝试写一个函数...
      99+
      2023-07-04
    • Spring boot jpa 删除数据和事务管理的问题实例详解
      今天我们介绍的是jpa删除和事务的一些坑,接下来看看具体内容。业务场景(这是一个在线考试系统)和代码:根据问题的id删除答案repository层:int deleteByQuestionId(Integer questionId);...
      99+
      2023-05-31
      spring boot 删除数据
    • SpringCloud-Spring Boot Starter使用测试实例分析
      这篇文章主要介绍了SpringCloud-Spring Boot Starter使用测试实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud-Spring ...
      99+
      2023-07-02
    • Java程序的脏数据问题实例分析
      本篇内容主要讲解“Java程序的脏数据问题实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序的脏数据问题实例分析”吧!  脏数据(Out-of-date data),指...
      99+
      2023-06-03
    • Spring Boot应用启动与关闭的示例分析
      这篇文章主要介绍Spring Boot应用启动与关闭的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring Boot,作为Spring框架对“约定优先于配置(Convention Over Config...
      99+
      2023-05-30
      spring boot
    • HTML5响应式banner实例分析
      本篇内容介绍了“HTML5响应式banner实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!<...
      99+
      2024-04-02
    • getScript缓存响应实例分析
      本篇内容介绍了“getScript缓存响应实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   C...
      99+
      2024-04-02
    • spring boot启动加载数据原理分析
      实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。创建实现接口 CommandLine...
      99+
      2023-05-31
      spring boot 启动
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作