springboot实现枚举参数

基础的枚举接口

public interface BaseEnum<K, V> {
    /**
     * 获取值
     *
     * @return {@link K}
     */
    @JsonValue
    K getValue();

    /**
     * 获取描述
     *
     * @return {@link V}
     */
    V getDescription();

    @JsonCreator
    BaseEnum<K, V> find(K value);
}

枚举工具类

public class BaseEnumUtil {

    /**
     * 代码
     *
     * @param enumClass 枚举类
     * @param code      密码
     * @return {@link E}
     */
    public static <E extends BaseEnum<Object, Object>> E codeOf(Class<E> enumClass, Object code) {
        E[] enumConstants = enumClass.getEnumConstants();
        for (E e : enumConstants) {
            if (e.getValue().toString().equals(code.toString())) {
                return e;
            }
        }
        return null;
    }

    public static <E extends BaseEnum> E codeOf(E[] values, Object code) {
        for (E e : values) {
            if (e.getValue().equals(code)) {
                return e;
            }
        }
        return null;
    }
}

1. json(以jackson为例)

BaseEnum接口中@JsonValue@JsonCreator是 Jackson JSON 处理库中的两个注解,它们用于在序列化反序列化过程中定制 Java 对象与 JSON 数据之间的映射。

示例枚举:

@AllArgsConstructor
@Getter
public enum StatusEnum implements BaseEnum<Integer, String> {

    /**
     * 是
     */
    YES(1, "是"),
    /**
     * 否
     */
    NO(0, "否"),
    ;

    private final Integer value;
    private final String description;


    @Override
    public String toString() {
        return value.toString();
    }

    @Override
    public BaseEnum<Integer, String> find(Integer value) {
        return BaseEnumUtil.codeOf(values(),value);
    }
}

2. 表单参数

通过实现org.springframework.core.convert.converter.Converter的方法

  • 转换类
@RequiredArgsConstructor
public class EnumConverter<E extends BaseEnum<Object, Object>> implements Converter<String, E> {

    private final Class<E> enumType;

    /**
     * 转换
     *
     * @param s s
     * @return {@link E}
     */
    @Override
    public E convert(@NonNull String s) {
        return BaseEnumUtil.codeOf(this.enumType, s);
    }
}
  • 转换工厂
@Component
@NoArgsConstructor
public class EnumConverterFactory implements ConverterFactory<String, BaseEnum<Object, Object>> {

    /**
     * 获取转换器
     *
     * @param targetType 目标类型
     * @return {@link Converter}<{@link String}, {@link T}>
     */
    @NonNull
    public <T extends BaseEnum<Object, Object>> Converter<String, T> getConverter(@NonNull Class<T> targetType) {
        return new EnumConverter<>(targetType);
    }
}
  • MVC配置
@Configuration
@RequiredArgsConstructor
public class SpringMvcConfig implements WebMvcConfigurer {


    private final EnumConverterFactory enumConverterFactory;

    /**
     * 添加格式化程序
     *
     * @param registry 注册表
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverterFactory(this.enumConverterFactory);
    }
}

相关推荐

  1. springboot实现参数

    2024-07-19 10:42:03       21 阅读
  2. SpringBoot实现类型参数认证

    2024-07-19 10:42:03       51 阅读
  3. golang实现

    2024-07-19 10:42:03       38 阅读
  4. 代码生成实践

    2024-07-19 10:42:03       59 阅读
  5. 递归实现组合型

    2024-07-19 10:42:03       29 阅读
  6. 实验问题(过程模拟)

    2024-07-19 10:42:03       33 阅读
  7. 实验问题(运算模拟)

    2024-07-19 10:42:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 10:42:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 10:42:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 10:42:03       58 阅读
  4. Python语言-面向对象

    2024-07-19 10:42:03       69 阅读

热门阅读

  1. C++:opencv将彩色图转换为灰度图

    2024-07-19 10:42:03       22 阅读
  2. shell处理用户输入——移动参数

    2024-07-19 10:42:03       20 阅读
  3. Github 2024-07-18 开源项目日报Top10

    2024-07-19 10:42:03       19 阅读
  4. React Router 6笔记

    2024-07-19 10:42:03       18 阅读
  5. dnd-kit for react: modern and light drag

    2024-07-19 10:42:03       19 阅读
  6. 模板方法设计模式

    2024-07-19 10:42:03       20 阅读