對於一些帶著固定標簽的欄位來說,我們通常把它們配置到欄位中,而在資料庫中存它們的字典code,或者是字典主鍵,不是一個整型的數字,而在前端顯示時,有時需要將它們翻譯成名稱,這時後端可以幫他們進行翻譯,或者前端通過code自己使用字典翻譯;下麵說一下第一種,後端在View model中將integer ...
對於一些帶著固定標簽的欄位來說,我們通常把它們配置到欄位中,而在資料庫中存它們的字典code,或者是字典主鍵,不是一個整型的數字,而在前端顯示時,有時需要將它們翻譯成名稱,這時後端可以幫他們進行翻譯,或者前端通過code自己使用字典翻譯;下麵說一下第一種,後端在View model中將integer類型的字典字典翻譯成一個k/v的對象。
JsonSerializer
一個json序列化的基類,我們可以繼承它,並實現自己的原因,在springboot框架中,你返回的json對象事實上是jackson幫我們做了一次序列化工作,而我們的欄位如果希望在序列化時行加工,可以利用這個環節,下麵定義一下DictionarySerializer,來實現字典欄位的序列化。
/**
* 自定義序列化器,將一個Integer類型的欄位序列化成一個name/code的對象
*/
public class DictionarySerializer extends JsonSerializer<Integer> {
@Autowired
DictionaryMapper dictionaryMapper;
@Override
public void serialize(Integer value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//獲取當前欄位的名稱
String type = jsonGenerator.getOutputContext().getCurrentName();
Integer code = (Integer) value;
jsonGenerator.writeStartObject();
Dictionary dictionary = dictionaryMapper.selectOne(
new QueryWrapper<Dictionary>().lambda()
.eq(Dictionary::getCode, code)
.eq(Dictionary::getType, type));
if (dictionary == null)
throw new IllegalArgumentException(String.format("字典數據未配置,類型:%s,值:%s", type, code));
jsonGenerator.writeStringField("name", dictionary.getName());
jsonGenerator.writeNumberField("code", code);
jsonGenerator.writeEndObject();
}
}
在實體中gender欄位會進行聲明
@ApiModelProperty("性別")
@JsonSerialize(using= DictionarySerializer.class)
private Integer gender;
在介面中返回一個對象,對象中包含了gender欄位,而這個欄位已經被序列化成對象,本例通過查詢資料庫實現,實際工作中,應該通過緩存來實現。
{
"id": "ab9a48d4f49d93237f7090d340d9fa07",
"username": "123",
"email": "[email protected]",
"phone": "13754911028",
"realName": null,
"roleList": [
{
"id": "1",
"name": "管理員1"
}
],
"createTime": "2022-04-12T10:04:14",
"updateTime": "2022-04-12T10:04:14",
"createBy": "admin",
"updateBy": "admin",
"status": 1,
"organization": null,
"job": null,
"gender": {
"name": "男",
"value": 0
}
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!