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序列化器:
- 先创建序列化器类:
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()); } }
- 启用序列化器有两种方式:
- 方式一:在枚举类上添加
@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
相关产品推荐
相关产品推荐

