1. 程式人生 > 程式設計 >Spring Boot 基於列舉前端字典返回

Spring Boot 基於列舉前端字典返回

原因

在資料庫表結構設計過程中,常常使用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(); } 複製程式碼
  1. 實現該列舉
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; } } 複製程式碼
  1. 生成一個Model
@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; } 複製程式碼
  1. Mybiatis Plus 列舉轉化配置 mybatis plus版本號 3.1.1(若3.1.0以下版本請更改default-enum-type-handler 詳見官網) application.yml
mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler
  type-enums-package: com.fidt.oims.module.system.model.enums
複製程式碼
  1. Jackson 新增IDictEnum序列化
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());
    }
}
複製程式碼
  1. 新增到DictEnumWebSerializer到ObjectMapper內
@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);
       });
    }

}
複製程式碼

展示