spring默认情况返回枚举是返回枚举的名称
@GetMapping("getUser")
public User getUser() {
User user = new User();
user.setName("wfs");
user.setSex(SexEnum.MALE);
return user;
}
返回值只是枚举的名称
{
"name": "wfs",
"sex": "MALE"
}
一般情况下,我们需要的是枚举自定义属性值
我们可以利用反射来实现,如果没有自定义的成员变量就返回枚举名称
static class EnumSerialzer extends JsonSerializer<Enum> {
private final static EnumSerialzer serialzer;
static {
serialzer = new EnumSerialzer();
}
public static EnumSerialzer getInstance() {
return serialzer;
}
private EnumSerialzer() {
}
@Override
public void serialize(Enum anEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
Class<? extends Enum> aClass = anEnum.getClass();
Field[] fields = aClass.getDeclaredFields();
List<Field> fieldList = Arrays.stream(fields).filter(f -> !Modifier.isStatic(f.getModifiers())).collect(Collectors.toList());
if (CollectionUtils.isEmpty(fieldList)) {
jsonGenerator.writeObject(anEnum.name());
} else {
jsonGenerator.writeStartObject();
for (Field field : fieldList) {
field.setAccessible(true);
jsonGenerator.writeFieldName(field.getName());
try {
jsonGenerator.writeObject(field.get(anEnum));
} catch (IllegalAccessException e) {
throw new IOException(e);
}
}
jsonGenerator.writeEndObject();
}
}
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomizer() {
return m -> {
m.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(Constant.DATE_TIME_FORMATTER));
m.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(Constant.DATE_TIME_FORMATTER));
m.serializerByType(Enum.class, EnumSerialzer.getInstance());
m.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
};
}
此时的返回结果
{
"name": "wfs",
"sex": {
"value": 1,
"desc": "男"
}
}