在数据库表结构设计过程中,常常使用status来表示当前记录的状态。返回给前端时,有时候需要后端手动调用查询数据库,返回字典翻译后的值,此操作过于麻烦。所以想使用的一个便捷的方式。
JSON序列化时,将翻译后的值从字典中取出,动态添加到返回的的数据内
项目采用Spring boot + Mybatis plus 进行开发 故采用了mybiatis plus的枚举接口 1.定义一个通用字典枚举,集成mybatis plus的IEnum
import com.baomidou.mybatisplus.core.enums.IEnum; import com.fasterxml.jackson.annotation.JsonValue; import java.io.Serializable; /** * @description: 通用字典枚举 * @author: wsat * @create: 2019-07-04 11:56 **/ public interface IDictEnum<T extends Serializable> extends IEnum<T> { /** * 数据库中存储的值 * @return */ @JsonValue @Override T getValue(); /** * 从数据库保存的字典ID * @return */ String getDictCode(); } 复制代码
public enum RoleEnum implements IDictEnum<String> { /** * 管理员 */ ADMIN("admin"), /** * 医生 */ DOCTOR("doctor"); public final static String DICT_CODE="ROLE"; RoleEnum(final String roleId){ this.value=roleId; } public String value; @Override public String getValue() { return value; } @Override public String getDictCode() { return DICT_CODE; } } 复制代码
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("user") @ApiModel(value="User对象", description="") public class User extends Model<User> { private static final long serialVersionUID = 1L; @TableId(value = "user_id", type = IdType.ID_WORKER) private Integer userId; @ApiModelProperty(value = "手机号") @TableField("phone") private String phone; @ApiModelProperty(value = "密码") @TableField("password") @JsonIgnore private String password; @ApiModelProperty(value = "角色") @TableField("role") private RoleEnum role; } 复制代码
mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler type-enums-package: com.fidt.oims.module.system.model.enums 复制代码
public class DictEnumWebSerializer extends JsonSerializer<IDictEnum> { @Override public void serialize(IDictEnum value, JsonGenerator jgen, SerializerProvider provider) throws IOException { if(value==null){ jgen.writeNull(); } jgen.writeObject(value.getValue()); jgen.writeFieldName(jgen.getOutputContext().getCurrentName()+"Name"); jgen.writeString(getEnumDesc(value)); } @Override public Class handledType() { return IDictEnum.class; } private String getEnumDesc(IDictEnum dictEnum){ //此处从缓存中读取字典的信息 return DictManger.getDictName(dictEnum.getDictCode(),dictEnum.getValue()); } } 复制代码
@Configuration public class WebConfig implements WebMvcConfigurer { @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); }); } } 复制代码