首页 > 其他分享 >Springboot传参时通过注解转换RequestBody中的枚举类型

Springboot传参时通过注解转换RequestBody中的枚举类型

时间:2022-10-09 10:12:36浏览次数:87  
标签:Springboot CodeToEnumDeserializer class public RequestBody 枚举 传参时 BaseEnum final

请求对象为@RequestBody MyRequest request时,MyReqeust中包含了枚举类型。
如果不加处理,前端只能传递枚举名或者枚举数组下标。
经过改造,可以传递自已定义的枚举值。

参考文章:https://blog.csdn.net/liuxinghao/article/details/119881628

具体实现步骤

  1. 定义基本枚举类
public interface BaseEnum {
    Integer getCode();

}
  1. 定义Jackson解析器
public class CodeToEnumDeserializer extends JsonDeserializer<BaseEnum> {

    @Override
    public BaseEnum deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {
        final Integer param = jsonParser.getIntValue();// 1
        final JsonStreamContext parsingContext = jsonParser.getParsingContext();// 2
        final String currentName = parsingContext.getCurrentName();// 3
        final Object currentValue = parsingContext.getCurrentValue();// 4
        try {
            final Field declaredField = currentValue.getClass().getDeclaredField(currentName);// 5
            final Class<?> targetType = declaredField.getType();// 6
            final Method valuesMethod = targetType.getDeclaredMethod("values");// 7
            BaseEnum[] enums = (BaseEnum[]) valuesMethod.invoke(null);
            for (BaseEnum anEnum : enums) {
                if(anEnum.getCode().equals(param)){
                    return anEnum;
                }
            }
            throw new RuntimeException("不匹配");
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | NoSuchFieldException e) {
            throw new RuntimeException("不匹配",e);
        }
    }
}
  1. 业务中的枚举类,需要继承BaseEnum
@Getter
@ToString
@AllArgsConstructor
@JsonFormat(shape=JsonFormat.Shape.OBJECT)
public enum OrderStatusEnum implements BaseEnum {

    NEW(1,"新建"),
    SEND(2,"配送"),
    RECEIVE(3,"收货"),
    DONE(4,"完成");

    private Integer code;
    private String name;

}
  1. 定义请求类,在枚举类上添加 @JsonDeserialize(using = CodeToEnumDeserializer.class)
@Data
@ToString
public class MyEnumRequest {

    private String orderSn;

    @JsonDeserialize(using = CodeToEnumDeserializer.class)
    private OrderStatusEnum orderStatus;

}
  1. 定义接口,进行测试
@PostMapping("enum-request")
public Rsp<MyEnumRequest> enumRequest(@RequestBody MyEnumRequest enumRequest){
    log.info("请求参数:{}",enumRequest);
    return Rsp.success(enumRequest);
}

具体请求返回如下:

// 请求参数
{
  "orderSn": "123",
  "orderStatus": 3
}

// 返回参数
{
  "code": 0,
  "mark": null,
  "info": "",
  "data": {
    "orderSn": "123",
    "orderStatus": {
      "code": 3,
      "name": "收货"
    }
  },
  "values": null,
  "success": true
}

总结

先定义BaseEnumCodeToEnumDeserializer解析器,在具体的业务枚举上添加@JsonDeserialize(using = CodeToEnumDeserializer.class)注解,即可实现需求。

标签:Springboot,CodeToEnumDeserializer,class,public,RequestBody,枚举,传参时,BaseEnum,final
From: https://www.cnblogs.com/virde/p/16771149.html

相关文章

  • Spring、springboot、springMVC、JPA、SpringData、springCloud的概述
    https://blog.csdn.net/qq_51308214/article/details/125165747Spring框架是Java平台上的一种开源应用框架, Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了......
  • SpringBoot框架中的DAO层、Entity层、Service层、Controller层
    https://blog.csdn.net/qq_40963664/article/details/123900763一般的项目模块中都有DAO、Entity、Service、Controller层。Entity层:实体层数据库在项目中的类DAO层:......
  • SpringBoot整合fastdfs
    1、背景在前一节中,我们搭建了一个单机版的fastdfs服务,此处我们将fastdfs与springboot进行整合,实现文件的上传和下载。2、整合步骤2.1、引入依赖<dependency><group......
  • SpringBoot整合fastdfs
    目录1、背景2、整合步骤2.1、引入依赖2.2、引入fastdfs配置2.3编写文件上传和下载接口2.4测试文件上传2.5文件下载3、参考文档1、背景在前一节中,我们搭建了一个单机版......
  • SpringBoot整合QQ邮箱发送
    邮件发送的基本过程与概念邮件服务器:类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中电子邮箱:用户在邮件服务器上申请的......
  • Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException--spr
    org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'indexController':Unsatisfieddependencyexpressedthroughfie......
  • springboot项目编译时,使用自定义注解类找不到符号
    springboot项目编译时,使用自定义注解类找不到符号Java项目编译时,使用自定义注解类找不到符号Spring-boot项目编辑器:idea问题:编译时找不到符号。项目中用到了自定义注解类......
  • 解决springboot 多表查询分页查询问题
    问题:springboot页面显示的数据来自三张不同的表,同时还要分页,不知道怎么查。解决过程:1、pom.xml文件中注入分页依赖2、application.yml添加分页配置3、自定义分页的......
  • springboot+热部署
    springboot框架已经用了很长时间了,每次调整代码都需要重启项目,很多时候就算是重启了,项目的一些资源还不能更新这就需要一个东西叫做热部署,顾名思义就是可以像hbuilder中编......
  • springboot 整合 recketMQ 详细步骤
    前提RocketMQ的部署环境可用1依赖包<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter<......