首页 > 其他分享 >springboot自定义枚举转换器

springboot自定义枚举转换器

时间:2024-08-10 20:54:51浏览次数:8  
标签:springboot 自定义 OrderType 枚举 import com public String

在Spring框架中,枚举类型的转换可以通过自定义的转换器来实现,这样可以方便地在请求参数、表单数据、以及数据库查询中使用枚举类型。

下面是关于Spring枚举转换器的详细介绍和使用方法:

以排序枚举为例

1. 定义枚举类

BaseEnum.java

package com.echo.model.enums;

public interface BaseEnum {

    Integer getCode();

    String getName();
}

OrderType.java

package com.echo.model.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;

public enum OrderType implements BaseEnum {

    ASC(1, "升序"),

    DESC(2, "降序");


    @EnumValue
    @JsonValue
    private Integer code;
    private String name;

    @Override
    public Integer getCode() {
        return this.code;
    }


    @Override
    public String getName() {
        return name;
    }

    OrderType(Integer code, String name) {
        this.code = code;
        this.name = name;
    }

}

2. 枚举转换器

在Spring中,实现Converter<S, T>接口来创建自定义枚举转换器。例如,将请求参数中的字符串转换为枚举类型:

package com.echo.webapp.works.custom.converter;

import com.echo.model.enums.OrderType;
import org.jetbrains.annotations.NotNull;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class StringToOrderTypeConverter implements Converter<String, OrderType> {

    @Override
    public OrderType convert(@NotNull String code) {
        try {
            for (OrderType value : OrderType.values()) {
                if (value.getCode().equals(Integer.valueOf(code))) {
                    return value;
                }
            }
            return OrderType.DESC;
        } catch (IllegalArgumentException e) {
            // 如果 code 无效,可以选择返回 null 或者默认值
            return OrderType.DESC; // 或者 return null;
        }
    }
}

这个转换器将String转换为OrderType枚举。Spring会自动注册该转换器,这样就可以在Controller的请求参数中直接使用枚举类型。

3. 注册转换器

可以通过实现WebMvcConfigurer接口,在全局范围内注册枚举转换器:

package com.echo.webapp.works.custom.config;

import com.echo.webapp.works.custom.converter.StringToOrderTypeConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Autowired
    private StringToOrderTypeConverter stringToOrderTypeConverter;

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(this.stringToOrderTypeConverter);
    }
}

4. 使用场景

a. 使用@RequestParam@PathVariable

枚举类型的请求参数可以直接映射到控制器的方法中,如:

@RequestMapping("/filter")
public String filterOrders(@RequestParam("orderType") OrderType orderType) {
    // 使用枚举进行操作
    return "Filtered by order type: " + orderType.name();
}

或者通过@PathVariable:

@RequestMapping("/filter/{orderType}")
public String filterOrders(@PathVariable("orderType") OrderType orderType) {
    return "Filtered by order type: " + orderType.name();
}

b. 枚举在实体类中的映射

package com.echo.webapp.works.vo;

import com.echo.model.enums.OrderType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Data
@Schema(description = "作品查询实体")
public class WorkQueryVo {

    @Schema(description = "作者id")
    private Long authorId;

    @Schema(description = "排序键")
    private String orderBy;

    @Schema(description = "排序方式")
    private OrderType orderType;

}

c. 在数据库中使用

<select id="pageWorkItemByQuery" resultType="com.echo.webapp.works.vo.WorkItemVo">
    SELECT *
    FROM work_info
    <where>
        is_deleted = 0
        <if test="queryVo.authorId != null">
            AND author_id = #{queryVo.authorId}
        </if>
    </where>
    ORDER BY
    <choose>
        <when test="queryVo.orderBy != null and queryVo.orderBy == 'view'">
            view_count
        </when>
        <otherwise>
            id
        </otherwise>
    </choose>
    <choose>
        <when test="queryVo.orderType != null and queryVo.orderType.name() == 'ASC'">
            ASC
        </when>
        <otherwise>
            DESC
        </otherwise>
    </choose>
</select>

标签:springboot,自定义,OrderType,枚举,import,com,public,String
From: https://www.cnblogs.com/echohye/p/18352776

相关文章

  • 如何在Java项目中使用自定义序列化器处理URL
    如何在Java项目中使用自定义序列化器处理URL在Java开发中,处理和序列化URL是一个常见的需求,尤其是在涉及到图像资源时。如果项目需要根据特定条件处理图像URL(如添加前缀),可以自定义一个序列化器来简化这一过程。本文将介绍如何创建一个自定义的ImgJsonSerializer类,处理单个URL和UR......
  • springboot框架的基本构建
    SpringBoot是一个用于简化Spring应用初始搭建以及开发过程的框架。它通过提供默认配置和约定优于配置的原则,让开发者能够快速启动和运行项目。本文将介绍SpringBoot的基础配置,帮助你快速上手并理解其核心概念。##环境准备在开始之前,确保你的开发环境已经准备就绪。你......
  • 基于Springboot+Vue的学院网站系统 (含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能这个系......
  • springboot+vue社区医疗服务管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着社会老龄化进程的加速和居民健康意识的不断提升,社区医疗服务作为公共卫生体系的重要一环,其重要性日益凸显。然而,传统社区医疗服务管理面临着信息孤岛、效率低下、资源分配不均等问题,难以满足居民日益增长的健康服务需求。特别是在......
  • springboot+vue社区物品交换平台的管理与实现【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着社会的快速发展和物质生活的日益丰富,社区居民之间物品闲置与浪费现象日益凸显。一方面,许多家庭拥有大量不再使用但仍具使用价值的物品;另一方面,这些物品对于其他家庭而言可能正是所需。在此背景下,构建一个社区物品交换平台显得尤为......
  • 基于SpringBoot的大学生智能消费记账系统
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,用户信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的大学生智能消费记账系统。本大学生......
  • springbootAl农作物病虫害预警系统-计算机毕业设计源码21875
    基于Vue+SpringBoot的Al农作物病虫害预警系统的设计与实现摘要随着农业现代化的推进,农作物病虫害的防治已成为农业生产中的重要环节。传统的病虫害防治方法往往依赖于农民的经验和观察,难以准确、及时地预测和防控病虫害的发生。因此,开发一种基于现代信息技术的农作物病虫......
  • springboot垂钓服务系统-计算机毕业设计源码17434
    摘要本文旨在针对垂钓爱好者的需求,基于微信小程序平台,设计并实现一套垂钓服务系统。首先,通过对用户需求进行调研和分析,确定了系统的基本功能模块,包括垂钓点信息展示、用户预约和支付、钓具租赁信息等。接着,借助微信小程序提供的开发框架和组件库,实现了系统的界面设计和交互功......
  • 【计算机毕设论文】基于SpringBoot+Vue线上学习平台的设计与实现
    ......
  • 免费【2024】springboot 高校竞赛管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......