Spring Boot 基於列舉前端字典返回
阿新 • • 發佈:2019-12-31
原因
在資料庫表結構設計過程中,常常使用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;
}
}
複製程式碼
- 生成一個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;
}
複製程式碼
- 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
複製程式碼
- 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());
}
}
複製程式碼
- 新增到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);
});
}
}
複製程式碼