對于一些帶著固定標簽的欄位來說,我們通常把它們配置到欄位中,而在資料庫中存它們的字典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
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458506.html
標籤:其他
下一篇:【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/
