小技巧:controller 返回结果 枚举序列化

1.原因
在数据库表结构设计过程中,常常使用status来表示当前记录的状态。返回给前端时,有时候需要后端手动调用查询数据库,返回字典翻译后的值,此操作过于麻烦。所以想使用的一个便捷的方式。
2.原理
JSON序列化时,将翻译后的值从字典中取出,动态添加到返回的的数据内
3.实现

public interface IEnum extends Serializable {

    /**
     * 获取枚举名称
     *
     * @return name
     */
    String name();

    /**
     * 获取枚举信息
     *
     * @return message
     */
    String getMessage();

}
public class DictEnumWebSerializer extends JsonSerializer {
    @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> 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;

}

返回结果

image.png

参考:https://juejin.cn/post/6844903939737911303

你可能感兴趣的:(小技巧:controller 返回结果 枚举序列化)