springboot 注解属性转换字典

news2025/2/27 17:26:10

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() {
    }

    @Override
    public 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);
    }

    @Override
    public 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 {
    @Autowired
    private CarMapper carMapper;
    
    @Override
    public 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中
     */
    @Override
    public 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.coloradmin.cn/o/1477226.html

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

相关文章

图神经网络实战——图论

图神经网络实战——图论 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) 是数学…

【深度学习:标记数据】为医生标记数据缓解疼痛

【深度学习&#xff1a;标记数据】为医生标记数据缓解疼痛 问题实验结果结论 我开始在物理学方面进行学术研究&#xff0c;但在第一年就退学了&#xff08;抱歉&#xff0c;休学了&#xff09;我的博士学位&#xff0c;并在定量金融领域做了很长一段时间。因此&#xff0c;在我…

从0到1实现五子棋游戏!!

Hello&#xff0c;好久不见宝子们&#xff0c;今天来给大家更一个五子棋的程序~ 我们今天要讲的内容如下&#xff1a; 文章目录 1.五子棋游戏介绍1.1 游戏玩法介绍&#xff1a; 2.准备工作2.1 具体操作流程 3.游戏程序主函数4.初始化棋盘4.1.定义宏变量4.2 初始化棋盘 5.打印…

git的使用 -- 代码托管平台阿里云

准备工作&#xff1a;git下载&#xff0c;环境配置git config --global user.name/user.email &#xff08;这个是注解不用加&#xff0c;这里是两行命令&#xff0c;前面相同/前后各是一个&#xff09; 注册一个网站码云、阿里云等等创建远程仓库配置SSH公钥 生成公钥 ssh-ke…

流程图怎么画?只需这几步就可以搞定!

你在工作中有没有遇到过下面这些问题&#xff1a; 思维混乱&#xff0c;想快速厘清一个项目的逻辑&#xff1b; 想让客户轻松接受自己的设计构思/产品理念等&#xff1b; 产品流程总是百密一疏&#xff0c;经常遗漏了某种用户需求&#xff1b; 想让小伙伴们快速理解一件事&…

2019年下半年教师资格证考试《综合素质》(中学)题

2.吴老师在指导青年教师时说道&#xff1a;“我们是生物老师&#xff0c;自己就知道生物的多样性和保护这种多样性的重要&#xff0c;所以对各有所长的学生&#xff0c;我们可不能做一个把学生修剪得整整齐齐的园丁。”这种说法表明教师劳动具有&#xff08; C&#xff09;。 A…

JavaScript 基础学习笔记(五):函数、作用域、匿名函数

目录 一、函数 1.1 声明和调用 1.2 形参和实参 1.3 返回值 二、作用域 2.1 全局作用域 2.2 局部作用域 三、匿名函数 3.1 函数表达式 3.2 立即执行函数 一、函数 理解函数的封装特性&#xff0c;掌握函数的语法规则 1.1 声明和调用 函数可以把具有相同或相似逻辑的代…

女性力量崛起,三八妇女节5大品牌创意案例!

随着女性意识的觉醒&#xff0c;越来越多的女性正在看见、勇敢表达自己&#xff0c;并努力提升自己、且坚定地爱自己&#xff01; 从近些年的三八妇女节主题活动中&#xff0c;我们能看到越来越多的品牌都在策划品牌、产品活动时&#xff0c;越来越注重聚焦女性成长、性别议题…

Shopify如何调取开放接口实现页面更新

Shopify提供了开放接口&#xff08;API&#xff09;&#xff0c;使开发人员能够通过编程方式与Shopify平台进行交互&#xff0c;并实现页面的更新。通过调用API&#xff0c;您可以获取和更新商店的数据&#xff0c;包括产品、订单、顾客信息等。下面是使用Shopify开放接口实现页…

【GB28181】wvp-GB28181-pro修改分屏监控为16画面(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 由于实际开发中,可能预览的画面多于8个,而wvp目前只支持8画面 本文快速帮助开发者修改分屏监控为多画面。例如16画面,20画面等 文章目录 一、 预期效果展示16分割画面20分割画面二、 源码修改-前端修改…

CV论文--2024.2.28

source:CV论文--2024.2.28 1、StreamDiffusion: A Pipeline-level Solution for Real-time Interactive Generation 中文标题&#xff1a;StreamDiffusion: 一个用于实时交互生成的管道级解决方案 简介&#xff1a;我们介绍了StreamDiffusion&#xff0c;这是专为实时交互式图…

windows IIS 申请和配置https(SSL)的工具 win-acme

win-acme 是一个为Windows平台设计的工具&#xff0c;用于从Lets Encrypt自动获取和续期SSL/TLS证书&#xff0c;特别适合用于IIS&#xff08;Internet Information Services&#xff09;服务器。它的使用相对简单&#xff0c;提供了一个用户友好的命令行界面&#xff0c;以及一…

微服务API网关---APISIX

最近在做微服务调研&#xff0c;看到了apisix这个网关&#xff0c;于是进行了初步了解一下。 微服务是指&#xff0c;将大型应用分解成多个独立的组件&#xff0c;其中每个组件都各自的负责对应项目。 系统的架构大致经历了&#xff1a;单体应用架构–> SOA架构 -->微服务…

5G提速工业物联网发展

对于普通消费者来说&#xff0c;5G的概念可能就是更快的网速&#xff0c;5G带来的上网体验提升是最直观的&#xff0c;因为拿手机可以实时观看高清晰度的视频&#xff0c;且无需太久的等待时间。 而更低的时延与更高的可靠性对C端用户带来的体验改善&#xff0c;相对来说就小很…

文献阅读:Large Language Models are Null-Shot Learners

文献阅读&#xff1a;Large Language Models are Null-Shot Learners 1. 文章简介2. 方法介绍3. 实验考察 & 结论 1. 基础实验 1. 实验设计2. 实验结果 2. 消融实验 1. 小模型上的有效性2. ∅CoT Prompting3. 位置影响4. 组成内容 4. 总结 & 思考 文献链接&#xff1…

langchain加载模型时出现ConnectionError: (ProtocolError(‘Connection aborted.‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

瑞_23种设计模式_组合模式

文章目录 1 组合模式&#xff08;Composite Pattern&#xff09;1.1 介绍1.2 概述1.3 组合模式的结构1.4 组合模式的分类1.5 组合模式的优点1.6 组合模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列…

基于java+springboot景区行李寄存管理系统设计和实现

基于javaspringboot景区行李寄存管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取…

低代码平台与MES:智能制造的新篇章

随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。传统的MES系统实施周期长、成本高&#xff0c;成为许多企业数字化转型的瓶颈。而低代码开发平台的出现为这一问题提供了新的解决思路。 一、万界星空科技低代码平台的优势&#xff1a; …

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…