定制@ResponseBody

自定义注解类(annotation):

IgnoreResult该类用于忽略不使用@ResponseBody

package com.baizhi.mall.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//元注解:描述注解的注解
@Retention(RetentionPolicy.RUNTIME)//设置当前注解保留到什么项目的什么阶段
//当前的注解类可以作用到什么位置上
@Target({ElementType.TYPE,ElementType.METHOD})
//@interface:声明为注解类
public @interface IgnoreResult {
}

 ResultBody使用该类声明使用定制的@ResponseBody

package com.baizhi.mall.api.annotation;import org.springframework.web.bind.annotation.ResponseBody;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//元注解:描述注解的注解
@Retention(RetentionPolicy.RUNTIME) //设置当前注解保留到什么项目的什么阶段
@Target({ElementType.TYPE, ElementType.METHOD}) //当前的注解可以作用在类的什么位置上
//如果类或者方法上面有此注解,那么就代表。当前类中所有的方法都需要我们自动类型包装
public @interface ResultBody {
}

配置自定义的ResponseBodyAdvice

package com.baizhi.mall.advice;import com.baizhi.mall.annotation.IgnoreResult;
import com.baizhi.mall.annotation.ResultBody;
import com.baizhi.mall.api.vo.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;//ResponseBodyAdvice springboot中自定义@ResponseBody需要的通知接口
//扫描Controller中定义的自定义注解 或 @restControllerAdvice
@ControllerAdvice                               
public class MyResponseBodyAdvice implements ResponseBodyAdvice {/*** 本方法代表我们的返回值是否需要进行自动类型保证为beforeBodyWrite中定义的转换值* @param returnType  方法的参数:返回值信息* @param converterType    转换的类型*                         比如:Controller中方法的返回值是String,那么converterType就会是StringHttpMessageConverter*                              Controller中方法的返回值不是String,那么converterType就会是MappingJackson2HttpMessageConverter* @return  如果返回值是true则需要包装成Result类型;如果返回值是fasle,则不需要包装成*/@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {System.out.println("=============supports========returnType======》"+returnType);//返回值本身就是Result,不需要转换if (returnType.getParameterType().isAssignableFrom(Result.class)){return  false;}//如果方法上或者类上有@IgnoreResult,不需要转换if (returnType.hasMethodAnnotation(IgnoreResult.class)|| AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(),IgnoreResult.class)){return false;}//如果方法上或者类上有@ResultBody,需要转换if (returnType.hasMethodAnnotation(ResultBody.class)|| AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(),ResultBody.class)){return true;}return false;}/*** 进行实际类型保证的方法* body:就是我们方法的返回值*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {System.out.println("=============beforeBodyWrite=========body=====》"+body);//创建JSON转换的类对象ObjectMapper mapper= Jackson2ObjectMapperBuilder.json().build();//如果body是字符串,我们需要转换成Json格式if(body instanceof String){//以Result规范式返回值返回Result<Object> result=Result.ok(body);try {return   mapper.writeValueAsString(result);} catch (JsonProcessingException e) {e.printStackTrace();}}return Result.ok(body); //不是String类型, 直接转换。 body就变成了Resuslt类中的data}
}

 Result该类为响应返回时alibaba规范式的返回值

package com.baizhi.mall.api.vo;import com.baizhi.mall.api.ResponseStatus;
import com.baizhi.mall.api.constant.ResponseStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;/*** @param <T>  :就是参数化类型!*           简而言之,就是用户调用的时候,传什么,T就是什么!*  如果不写泛型T,那么data的数据类型必须是Object.*           那么每次获取data的时候,就必须做类型转换,比较繁琐。*           实现的效果是一样的。*  不同的请求,可能得到相同的状态码和状态信息。*           这样就会导致,代码冗余。*           这时候我们就需要创建一个接口,就是统一规范。*           只要是成功了,那么就返回我这个接口对应的值。**/
@Data
@AllArgsConstructor //省略了带参构造
public class Result<T> {private  int code; //状态码private  String message; //状态码信息private  T data; //返回的具体数据//第二步:创建构建者的调用方式public  static <T>Builder<T> builder(){return  new  Builder<>();//这个builder对象是空的,要给那个属性赋值,直接 点 方法名即可。//Result.builder().code(200).message("message");}//第2种:通过status接收ResponseStatus后续只需要添加data再build就可以:status(responseStatus).build(datapublic static <T> Builder<T> status(ResponseStatus status) {return Result.<T>builder().status(status);}//第3种:提供开发最常见的2种状态的简化方式ok和errorpublic static <T> Result<T> ok() {return Result.ok((T) null);}public static <T> Result<T> ok(T data) {return Result.<T>status(ResponseStatusEnum.SUCCESS).data(data).build();}public static <T> Builder<T> ok(String message) {return Result.<T>builder().code(ResponseStatusEnum.SUCCESS.getCode()).message(message);}public static <T> Result<T> error() {return Result.<T>status(ResponseStatusEnum.FAILED).build();}public static <T> Result<T> error(String message){return Result.<T>builder().code(ResponseStatusEnum.FAILED.getCode()).message(message).build();}//第一步:创建Result类的构建者,针对Result类中的属性,进行组合public static  class Builder<T>{private  int code; //状态码private  String message; //状态码信息private  T data; //返回的具体数据private  Builder(){}public  Builder<T> status(ResponseStatus status){this.code=status.getCode();this.message=status.getMessage();return  this;}public  Builder<T> code(int code){this.code=code;return  this;}public  Builder<T> message(String message){this.message=message;return  this;}public  Builder<T> data(T data){this.data=data;return  this;}public  Result<T> build(){return  new Result(code,message,data);}public  Result<T> build(T data){this.data(data);return  build();}}}

使用自定义注解在Controller的类和方法上 

@GetMapping("/haha")
@ResultBody //自定义注解  转换成Result对象
public String haha(){System.out.println("==================haha=====================");return "haha";
}
@GetMapping("/haha1")
@IgnoreResult //不转换成Result对象
public String haha1(){System.out.println("==================haha1=====================");return "haha1";
}
@GetMapping("/list")
@ResultBody //自定义注解  转换成Result对象
public List<Student> list(){System.out.println("==================list=====================");List<Student> students=new ArrayList<>();students.add(new Student(1,18,"小黑1"));students.add(new Student(2,14,"小黑2"));students.add(new Student(3,16,"小黑3"));return students;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2312d,D语言单元测试等

原文 我最近决定在"系统编程"领域试些小众语言.我已用了Java,Dart和Kotlin等高级语言编程多年了(并试了许多其他相同级别或更高级的语言),需要扩大视野,因为对某些类型应用,这些语言并不是最好的工具. 这篇博文中,我想重点介绍D语言这里,经过一些初步实验,它比其他语…

Vue3 的效率提升主要表现在哪些方面?

Vue3带来了许多性能优化和效率提升的特性。本文将重点讨论Vue3在静态提升、预字符串化、缓存事件处理函数、Block Tree和PatchFlag方面的改进。我们将通过对比Vue2和Vue3的编译结果来说明这些方面的效率提升。 静态提升 在Vue2中&#xff0c;每次渲染时都会重新创建VNode节点…

linux | 软连接与硬链接 | 实测

很多知识&#xff0c;我们都是通过学习其他博主的博客&#xff0c;可是学习的过程 常常需要辩证的去辨别真伪。这很耗精力&#xff0c;最好的方法就是实践去检测。 软链接 和 应链接 在 linux 上操作非常重要 常见场景&#xff1a;最重要的就是&#xff0c;做备份&#xff0c;尤…

Talk | 约翰霍普金斯大学博士生魏晨: De-Diffusion-文本是不同模态的沟通桥梁

本期为TechBeat人工智能社区第557期线上Talk。 北京时间12月20日(周三)20:00&#xff0c;约翰霍普金斯大学博士生—魏晨的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “De-Diffusion-文本是不同模态的沟通桥梁题”&#xff0c;介绍了她的团队在如…

面向对象程序设计(异常,RTTI,泛型,动态加载)

异常 首先&#xff0c;我们知道Java中的异常分为两大类&#xff1a;编译时异常和运行时异常。编译时异常通常是一些在编写代码时就能发现的错误&#xff0c;比如文件找不到之类的&#xff1b;而运行时异常则是在程序运行过程中出现的&#xff0c;比如除零错误。 我们可以使用…

Linux---进程状态

目录 一、系统进程状态介绍 1.运行状态 2.阻塞状态 3.挂起状态 二、Linux中的进程状态 1.R (running) 2.S (sleeping) 3.D&#xff08;disk sleep&#xff09; 4.T&#xff08;stopped&#xff09; 5.t&#xff08;tracing stop&#xff09; 6.X&#xff08;dead&am…

liunx安装git

安装 Git 更新包列表: 首先&#xff0c;更新您的包管理器的包列表。这确保您可以安装最新版本的 Git。在基于 Debian 的系统&#xff08;如 Ubuntu&#xff09;上&#xff0c;使用以下命令&#xff1a;sudo apt-get update如果您使用的是基于 RPM 的系统&#xff08;如 CentOS&…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

楼宇对讲、可视门铃案例分析

语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器、衰减器和几种控制 功能&#xff0c;包括发送和接收衰减器、 背景噪声电平检测系统和一个衰 减器控制系统&#xff0c;对发送和接收电 平好于背景噪声做出反…

PyCharm添加自动函数文档注释

目录 1、背景2、开启PyCharm自动函数文档注释 1、背景 规范的函数文档注释有助于他人理解代码&#xff0c;便于团队协作、提高效率。但如果我们自己手写函数文档注释将非常耗时耗力。PyCharm安装后默认没有开启自动化函数文档注释&#xff0c;需要我们开启 2、开启PyCharm自动…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

55.0/CSS 的应用(详细版)

目录 55.1.1 设计边框样式 55.1.2 调整边框的粗细 55.1.3 边框颜色 55.1.4 复合设置边框 55.2 模块的边距 55.3 模块的内边距 55.4 层的应用 55.4.1 层的建立 55.4.2 浮动——float 55.4.3 清除浮动 55.4.4 层的定位 55.4.5 设置层的溢出——overflow 55.4.6 设置鼠…

Linux开发工具——vim篇

vim开发工具的使用 文章目录 vim开发工具的使用认识vimvim常用三种模式vim正常模式命令集模式切换移动光标删除文字赋值替换撤销上一次操作更改跳到指定的行 vim末行模式命令集列出行号跳到文件中的某一行&#xff1a;保存文件离开vim查找字符&#xff1a; 总结题外话&#xff…

spring使用@Autowired @Lazy 注解 解决循环依赖

今天在启动项目时报错&#xff1a;org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘colorController’: Unsatisfied dependency expressed through field ‘projectService’; nested exception is org.springframework.…

Solidity-2-合约结构

在 Solidity 语言中&#xff0c;合约类似于其他面向对象编程语言中的类。 每个合约中可以包含 状态变量、 函数、 函数 , 事件 Event, 错误(Errors), 结构体 和 枚举类型 的声明&#xff0c;且合约可以从其他合约继承。 还有一些特殊的合约&#xff0c;如&#xff1a; 库 和 …

使用Dropzone提升开发效率的全方位指南

开发过程中&#xff0c;文件上传、图像处理、脚本执行等任务常常是不可或缺的环节。为了提升开发效率&#xff0c;开发者需要一个强大且灵活的工具。在这方面&#xff0c;Dropzone 是一个非常优秀的选择。本文将介绍如何在各种使用场景下&#xff0c;利用 Dropzone 工具来提高开…

C++复合数据类型:字符数组|读取键盘输入|简单读写文件

文章目录 字符数组&#xff08;C风格字符串&#xff09;读取键盘输入使用输入操作符读取单词读取一行信息getline使用get读取一个字符 读写文件 字符数组&#xff08;C风格字符串&#xff09; 字符串就是一串字符的集合&#xff0c;本质上其实是一个“字符的数组”。 在C中为了…

【数据结构和算法】子数组最大平均数 I

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 滑动窗口含义 2.2 滑动窗口一般解法 2.3 方法一&#xff1a;滑动窗口 三、代码 3.1 方法一&#…

异步编程Promise

文章目录 前言一、关于 Promise 的理解与使用1.相关知识补充区别实例对象和函数对象同步回调异步回调Js中的错误&#xff08;error&#xff09;和错误处理 2.promise是什么 二、Promise 原理三、Promise 封装 Ajax四、async 与 await总结 前言 在项目中&#xff0c;promise的使…

Easyrecovery2024手机版文件数据恢复软件

Easyrecovery是著名数据恢复厂商Kroll Ontrack推出文件的恢复软件&#xff0c;因病毒、误删、U盘故障等问题导致的word/excel/ppt/照片等文件丢失的情况&#xff0c;Easyrecovery能做到较高的恢复成功率&#xff01;Easyrecovery是全球著名数据恢复厂商Kroll Ontrack推出的文件…