You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot RESTful服务如何返回字符串枚举的实际字符串值

Spring Boot RESTful服务如何返回字符串枚举的实际字符串值

嘿,这个问题我做项目时也碰到过,其实Spring Boot里有几种简单方式能解决,让你的REST接口返回枚举对应的实际字符串值(比如"No deal today"),而不是枚举的常量名(比如"No_deal_today")。下面给你分享几个常用方案:

方法一:给枚举的取值方法添加@JsonValue注解(最推荐)

这是最省事的办法,只需要在你的ResultEnum类的getResult()方法上加上Jackson的@JsonValue注解,Jackson序列化枚举时就会自动用这个方法返回的字符串值,而非枚举常量名。

修改后的枚举代码如下:

import com.fasterxml.jackson.annotation.JsonValue;

public enum ResultEnum {
    Sold("Sold"),
    No_deal_today("No deal today"),
    Appointment("Appointment");

    private String result;

    private ResultEnum(String result) {
        this.result = result;
    }

    @JsonValue // 新增这个注解
    public String getResult() {
        return result;
    }

    public static ResultEnum fromResult(String result) {
        switch (result) {
            case "Sold":
                return ResultEnum.Sold;
            case "No deal today":
                return ResultEnum.No_deal_today;
            case "Appointment":
                return ResultEnum.Appointment;
            default:
                throw new IllegalArgumentException("ResultEnum [" + result + "] not supported.");
        }
    }
}

这样接口返回的result字段就会是枚举对应的实际字符串,而且你之前写的ResultConverter(数据库交互用的转换器)完全不受影响,两者各司其职。

方法二:自定义Jackson序列化器

如果不能修改枚举类,或者需要更灵活的序列化逻辑,可以自定义Jackson序列化器:

  1. 先创建序列化器类:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;

public class ResultEnumSerializer extends StdSerializer<ResultEnum> {

    protected ResultEnumSerializer() {
        super(ResultEnum.class);
    }

    @Override
    public void serialize(ResultEnum resultEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 序列化时输出枚举的实际字符串值
        jsonGenerator.writeString(resultEnum.getResult());
    }
}
  1. 启用序列化器有两种方式:
    • 方式一:在枚举类上添加@JsonSerialize注解指定序列化器:
      import com.fasterxml.jackson.databind.annotation.JsonSerialize;
      
      @JsonSerialize(using = ResultEnumSerializer.class)
      public enum ResultEnum {
          // 枚举原有代码不变
      }
      
    • 方式二:在Spring Boot配置类里全局注册序列化器,所有用到ResultEnum的地方都会生效:
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import com.fasterxml.jackson.databind.ObjectMapper;
      import com.fasterxml.jackson.databind.module.SimpleModule;
      
      @Configuration
      public class JacksonConfig {
          @Bean
          public ObjectMapper objectMapper() {
              ObjectMapper objectMapper = new ObjectMapper();
              SimpleModule module = new SimpleModule();
              module.addSerializer(ResultEnum.class, new ResultEnumSerializer());
              objectMapper.registerModule(module);
              return objectMapper;
          }
      }
      

方法三:通过DTO中转返回字符串

如果你的接口是通过DTO(数据传输对象)返回数据,也可以直接在DTO里用String类型存储枚举的实际值,而非ResultEnum类型。比如:

public class ResultDTO {
    private String result;

    // 构造方法,从枚举赋值
    public ResultDTO(ResultEnum resultEnum) {
        this.result = resultEnum.getResult();
    }

    // getter和setter
    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}

然后在控制器里把ResultEnum转换成ResultDTO再返回,接口返回的自然就是对应的字符串了。

这几种方法都能解决问题,其中方法一最简单直接,推荐优先使用~

备注:内容来源于stack exchange,提问作者Rob Gravelle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:23:15