1.原因
在数据库表结构设计过程中,常常使用status来表示当前记录的状态。返回给前端时,有时候需要后端手动调用查询数据库,返回字典翻译后的值,此操作过于麻烦。所以想使用的一个便捷的方式。
2.原理
JSON序列化时,将翻译后的值从字典中取出,动态添加到返回的的数据内
3.实现
public interface IEnum extends Serializable {
/**
* 获取枚举名称
*
* @return name
*/
String name();
/**
* 获取枚举信息
*
* @return message
*/
String getMessage();
}
public class DictEnumWebSerializer extends JsonSerializer<IEnum> {
@Override
public void serialize(IEnum value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
if(value==null){
jgen.writeNull();
}
jgen.writeObject(value.name());
jgen.writeFieldName(jgen.getOutputContext().getCurrentName()+"Message");
jgen.writeString(value.getMessage());
// JSONObject json = new JSONObject();
// json.put("code",value.name());
// json.put("message",value.getMessage());
// jgen.writeObject(json);
}
@Override
public Class handledType() {
return IEnum.class;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
*@desc controller接口出参枚举序列化
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters){
converters.stream().filter(converter->converter instanceof MappingJackson2HttpMessageConverter).forEach(converter->{
MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter)converter;
DictEnumWebSerializer dictEnumSerializer = new DictEnumWebSerializer();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(dictEnumSerializer);
jsonConverter.getObjectMapper().registerModule(simpleModule);
});
}
}
4.测试
@Getter
@RequiredArgsConstructor
public enum ValueTypeEnum implements IEnum {
// ===
TEXT("文本"),
NUMBER("数字"),
DATE("日期"),
PERCENT("百分比"),
DROP_DOWN("下拉列表"),
;
public static final String MSG = "列的值类型:TEXT-文本、NUMBER-数字、DATE-日期、PERCENT-百分比、DROP_DOWN-下拉列表";
private final String message;
}
返回结果
参考:https://juejin.cn/post/6844903939737911303