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.hqwc.cn/news/501503.html

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

相关文章

C++:String类的使用

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 在C语言中&#xff0c;我们想要存储字符串的话必须要用字符数组 char str[]"hello world"这其实是将在常量区的常量字符串拷贝到数组中&#xff0c;我们会在数组的结尾多开一个空间存储\0&#xff0c;这样我…

bootstrap-table 多层组合表头

如下图所示的二层组合表头 来人&#xff0c;上代码&#xff01; table.bootstrapTable({url: $.fn.bootstrapTable.defaults.extend.index_url,pk: id,sortName: id,search: false,showToggle: false,showColumns: false,showExport: false, commonSearch: false,columns: [[…

Linux环境搭建Jenkins(详细图文)

目录 简介Jenkins 特点 一、环境准备 1.jdk环境准备 2.maven环境准备 3.git环境准备 二、安装部署Jenkins&#xff08;采用war包方式&#xff09; 1.下载Jenkins ​2.启动war包 1&#xff09;将下载好的Jenkins的war包上传到服务器上 2&#xff09;编辑启动脚本,方便…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建MindSpore知识库

InternLM 模型部署 准备环境 拷贝环境 /root/share/install_conda_env_internlm_base.sh InternLM激活环境 conda activate InternLM安装依赖 # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【算法】长短期记忆网络(LSTM,Long Short-Term Memory)

这是一种特殊的循环神经网络&#xff0c;能够学习数据中的长期依赖关系&#xff0c;这是因为模型的循环模块具有相互交互的四个层的组合&#xff0c;它可以记忆不定时间长度的数值&#xff0c;区块中有一个gate能够决定input是否重要到能被记住及能不能被输出output。 原理 黄…

2024深圳国际微波射频技术展览会暨华南微波射频技术研讨会

2024深圳国际微波射频技术及应用展览会 2024年4月9日至11日&#xff0c;一场全球瞩目的科技盛宴将在深圳会展中心&#xff08;福田&#xff09;隆重举行。这便是2024深圳国际微波射频技术及应用展览会&#xff0c;一个汇集了国际顶尖微波射频技术厂商、科研机构和行业精英的盛会…

【YOLO v5 v7 v8 小目标改进】RFB:组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性

RFB&#xff1a;组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性 提出背景RFB 原理空间感受野结构RFB-Net 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 当前表现最好的目标检测器依赖于深层CNN骨干网络&#xff0c;如ResNet-101和Inception&am…

记录 android studio 通过安装NDK 编译C文件,得到需要的so文件

只怪自己太健忘&#xff0c;每次网上查了一圈&#xff0c;搞定后&#xff0c;再遇到又发现不会操作了&#xff0c;特此记下 不废话直接上步骤 &#xff08;1&#xff09; 进入AS的settinging如下界面 &#xff08;2&#xff09;选中图片箭头两个文件 进行下载 &#xff08;…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号&#xff08;PID&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

Qt样式表应用

1. Qt样式表概述 对Qt样式表应用毫无基础的可以先了解下Qt官方对样式表的说明&#xff1a;https://doc.qt.io/qt-5/stylesheet.html 简单来说就是给Qt的控件"化妆", 同样的控件可以通过改变样式表的设置表现出不同的效果&#xff0c;这些效果主要包括颜色、字体、线条…

光伏储能MPPT控制系统如何进行浪涌静电保护?

MPPT&#xff08;Maximum Power Point Tracking&#xff09;是太阳能电池板光伏发电系统中重要的一种控制技术。MPPT控制器能够实时侦测太阳能板的发电电压&#xff0c;并追踪最高电压电流值&#xff08;VI&#xff09;&#xff0c;使系统以最大功率输出对蓄电池充电&#xff0…

【Linux C | 网络编程】gethostbyaddr 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…