springboot~將一個Integer類型序列爲k/v對象

對於一些帶着固定標籤的字段來說,我們通常把它們配置到字段中,而在數據庫中存它們的字典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
                }
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章