springboot 注解属性转换字典

1.注解相关功能实现

  1. 定义属性注解

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.vehicle.manager.core.serializer.DicSerializer;import java.lang.annotation.*;/*** @author zr 2024/2/28*/
@JacksonAnnotationsInside
@JsonSerialize(using = DicSerializer.class
)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dic {String code();String fieldName()default "";
}
  1. 定义字典序列化器

import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.vehicle.manager.core.annotation.Dic;
import org.springframework.util.StringUtils;import java.io.IOException;
import java.util.Objects;/*** @author zr 2024/2/28*/public class DicSerializer extends JsonSerializer<String> implements ContextualSerializer {private String code;private String fieldName;public DicSerializer(String code, String fieldName) {this.code = code;this.fieldName = fieldName;}public DicSerializer() {}@Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(s);jsonGenerator.writeFieldName(fieldName);//这一步是通过code(字典类型code)和value(字段转换前的值)获取name(字段转换后的值),String name = DicData.getNameByCodeAndValue(this.code,s);jsonGenerator.writeString(name);}@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {if(beanProperty !=null){if(Objects.equals (beanProperty.getType ().getRawClass (), String.class)){Dic t =beanProperty.getAnnotation (Dic.class);if(t !=null){String beanFieldName = beanProperty.getName();if(StringUtils.hasText(t.fieldName())){beanFieldName = t.fieldName();}return new DicSerializer(t.code(),beanFieldName+"Text");}}return serializerProvider.findValueSerializer (beanProperty.getType (), beanProperty);}return serializerProvider.findNullValueSerializer (beanProperty);}
}
  1. 虚假的字典数据类
import java.util.HashMap;
import java.util.Map;/*** 字典数据*/
public class DicData {public static final Map<String, Map<Object,String>> dicData = new HashMap<>();static {//        todo 目前写死,可存入数据库或缓存//        车辆状态Map<Object,String> m1 = new HashMap();m1.put("0","初始化");dicData.put("carStatus",m1);}public static String  getNameByCodeAndValue(String code,String value){return dicData.get(code).get(value);}}

2.功能测试

测试场景:

  1. 使用mybatis plus查询数据库car表,将数据封装到CarDO(Car)
  2. 在service层将CarDO转换为CarVo,同时将CarDO的status字段通过注解转换并生成一个新的字段statusText
  1. CarDO
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;import java.time.LocalDate;import com.baomidou.mybatisplus.annotation.TableId;import java.time.LocalDateTime;import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.vehicle.manager.core.annotation.Dic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.io.Serializable;/*** <p>* 车辆信息* </p>** @author MybatisGenerator* @since 2024-02-21*/
@TableName("car")
@ApiModel("车辆实体类")
@Data
//@Accessors(chain = true)
public class Car extends BaseEntity implements Serializable {private static final long serialVersionUID = 2781951723978392659L;/*** 自增id*/@TableId(value = "id", type = IdType.AUTO)private Long id;// *****其他属性省略*****/*** 车辆状态*/@TableField("status")private String status;
}
  1. CarVo

此处Vo属性上加上自定义注解@Dic

import com.fasterxml.jackson.annotation.JsonFormat;
import com.vehicle.manager.core.annotation.Dic;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.time.LocalDate;/*** <p>* 车辆信息* </p>** @author MybatisGenerator* @since 2024-02-21*/
@ApiModel("车辆实体类")
@Data
@Accessors(chain = true)
public class CarVo extends BaseVo implements Serializable {private static final long serialVersionUID = 2781951723978392659L;/*** 自增id*/@ApiModelProperty("自增id")private Long id;// *****其他属性省略*****/*** 车辆状态*/@ApiModelProperty("车辆状态")@Dic(code = "carStatus")private String status;}
  1. 相关service实现类(service接口我就不写了)
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vehicle.manager.core.mapper.CarMapper;
import com.vehicle.manager.core.model.Result;
import com.vehicle.manager.core.model.dto.CarQueryDto;
import com.vehicle.manager.core.model.entity.Car;
import com.vehicle.manager.core.model.enumeration.CommonResultStatus;
import com.vehicle.manager.core.model.vo.CarVo;
import com.vehicle.manager.core.service.CarService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author zr 2024/2/26*/
@Service
public class CarServiceImpl implements CarService {@Autowiredprivate CarMapper carMapper;@Overridepublic Result page(CarQueryDto carQueryDto) {Page<Car> rowPage = new Page(carQueryDto.getPageNum(),carQueryDto.getPageSize());LambdaQueryWrapper<Car> queryWrapper = new LambdaQueryWrapper<>();Page<Car> carPage = carMapper.selectPage(rowPage, queryWrapper);IPage<CarVo> carVoIPage = carPage.convert(res -> getCarVo(res));return Result.success(carVoIPage);}/*** carDo 转 carVo* @param res* @return*/private static CarVo getCarVo(Car res) {CarVo carVo = new CarVo();BeanUtils.copyProperties(res, carVo);return carVo;}/*** 通过id查询数据,并封装到carDo中*/@Overridepublic Result getById(Integer carId) {Car car = carMapper.selectById(carId);CarVo carVo = getCarVo(car);return Result.success(carVo);}}
  1. 在48行打上断点debug

image.png

  1. 返回给前端的vo数据

可以看到通过注解生成了一个statusText字段,并且为字段中配置的转换后的值

image.png

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

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

相关文章

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(十一)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

家庭游泳池:阳台上可安装的泳池

游泳池可根据场地大小选择安装在室内或室外&#xff0c;这种的泳池规格尺寸相对来说较大&#xff0c;较适合于大型体育场馆、小区配套、健身房等场所。这款家庭泳池与之前的不太一样&#xff0c;不论是从池体材料还是装饰面层都有着很大的差异。 该家庭泳池规格尺寸比较固定&a…

书籍推荐|《使用 ESP32 开发物联网项目(第二版)》

随着物联网技术的迅猛发展&#xff0c;ESP32 因其强大的功能而备受物联网开发者的青睐。在此背景下&#xff0c;资深物联网专家 Vedat Ozan Oner 撰写的《使用 ESP32 开发物联网项目&#xff08;第二版&#xff09;》&#xff0c;为开发者提供了全面且深入的指南读物。 资深物…

SpringBoot整合rabbitmq-直连队列,没有交换机(一)

说明&#xff1a;本文章只是springboot和rabbitmq的直连整合&#xff0c;只使用队列生产和消费消息&#xff0c;最简单整合&#xff01; 工程图&#xff1a; A.总体pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://…

【精选】Java项目介绍和界面搭建——拼图小游戏 上

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

实施顾问的 IDoc 基础知识

目录 一、前言二、概览三、EDI 标准和 IDOC四、IDOC 术语4.1 IDOC&#xff08;基本&#xff09;类型4.2 IDOC 扩展&#xff08;EXTENSION&#xff09;4.3 IDoc 段4.4 父项 IDoc 段与子项 IDoc 段4.5 入站/出站 IDOC4.6 IDOC方向4.7 合作伙伴4.8 合作伙伴类型4.9 消息类型4.10 流…

在Ubuntu中安装Anaconda和创建虚拟环境(保姆级教学,值得借鉴与信任)

一、下载linux版本的Anaconda 1.方法一&#xff1a;官网下载 https://www.anaconda.com/download#downloads2.方法二&#xff1a;在清华大学开源软件镜像站里下载 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/最后选择了Anaconda3-2022.10-Linux-x86_64.sh进行下…

【EFK】基于K8S构建EFK+logstash+kafka日志平台

基于K8S构建EFKlogstashkafka日志平台 一、常见日志收集方案1.1、EFK1.2、ELK Stack1.3、ELK filbeat1.4、其他方案 二、EFK组件介绍2.1、Elasticsearch组件2.2、Filebeat组件【1】 Filebeat和beat关系【2】Filebeat是什么【3】Filebeat工作原理【4】传输方案 2.3、Logstash组件…

python 中常用的热门库介绍

阅读本文之前请参阅-----如何系统的自学python Python 是一种非常流行的编程语言&#xff0c;它的一个主要优势是拥有一个庞大的生态系统&#xff0c;其中包括许多强大的库。这些库为各种任务提供了解决方案&#xff0c;从数据分析到机器学习&#xff0c;从网络爬虫到图像处理。…

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…

推荐一款ssh工具 xshell替代品 electerm

下载地址 electerm&#xff1a; https://electerm.github.io/electerm/ windows版本 产品优势 复制粘贴&#xff0c;可以直接使用ctrlc/v 非常的方便 而且不想xshell 需要账号登陆&#xff0c;有更新弹窗&#xff0c;自身集成了sftp 界面设计更新&#xff0c;比MobaXterm的…

2024年值得关注的5款国产低代码开发平台

最近几年&#xff0c;低代码\无代码\零代码技术和快速开发平台比较热门&#xff0c;全球知名低代码平台厂商有&#xff1a;微软Power Platform、西门子Mendix、OutSystems等。我们国内最近几年也有一些信创国产化低代码平台涌现出来&#xff0c;比如&#xff1a;云程、氚云、轻…

【计算机网络】一些乱七八糟内容

MAC Media Access Control 用于在局域网&#xff08;LAN&#xff09;或广域网&#xff08;WAN&#xff09;中实现设备自动接入网络 "载波侦听多路访问"(Carrier Sense Multiple Access) CSMA/CD 是CSMA的升级版本&#xff0c;加入了序列号检测机制。 CSMA/CA 是CSM…

阿里又放大招 EMO:一张照片+音频即可生成会说话唱歌的视频

项目简介 你只需要提供一张你的照片任意的音频文件&#xff0c;就能实现你说任何话或唱任何歌曲的动态视频。同时生成视频的长度和你音频长度相匹配&#xff01;表情非常到位&#xff0c;支持任意语音、任意语速、任意图像。 主要特点和功能 1、音频驱动的人像视频生成&#…

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫&#xff1f;二、普通人如何通过网络爬虫赚钱&#xff1f;2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一&#xff1a;ebay电商【…

lv19 多态 4

1 虚函数 虚函数&#xff08; 基类指针可指向派生类对象&#xff0c; 动态联编&#xff09; 先看示例&#xff0c;不加virtual&#xff0c;不认对象认指针。 #include <iostream>using namespace std;class A{ public:A(){ }~A(){ }void show(){cout<<"AAA…

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…

三款热门超声波清洗机对比测评:希亦、固特、大宇多维度实测!

如果你非常在意物品的健康卫生&#xff0c;并且希望能够摆脱手动清洗一些物品而彻底解放双手&#xff01;在家备一款超声波清洗机还是非常有必要的&#xff01;无论是珠宝、眼镜还是日常小物&#xff0c;都希望能够保持如新的光泽和卫生状态。那么超声波清洗机是最合适不过的&a…

ubuntu22.04工具整理以及安装使用方式

截图工具 火焰截图 安装&#xff1a; sudo apt install flameshot增加自定义快捷键&#xff1a; 然后就可是使用是指的快捷键进行截图了。 如果没有在截图上编辑的需要&#xff0c;其实自带的截图也够用的。

2 网络技术基础(2)

1.网络拓扑分类 基本的网络拓扑有五种&#xff1a;星形、环形、总线形、树形与网状。 1.1 星形拓扑 星形拓扑结构的主要特点是&#xff1a;①节点通过点-点通信线路与中心节点连接&#xff1b;②中心节点控制全网的通信&#xff0c;任何两节点之间的通信都要通过中心节点&…