第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 RestController 中基于 JsonView 使用兩個不同的 getter

如何在 RestController 中基于 JsonView 使用兩個不同的 getter

慕田峪7331174 2022-11-02 10:12:14
我希望能夠基于 JsonView 序列化對象中的字段。不一定非要JsonView,這正是我一直在探索的?;旧显?RestController 類上使用 @JsonView 注釋,它會序列化我的 POJO。但是我有一個用戶和管理員視圖,其中有一個對象:地圖秘密;對于管理員視圖,我希望 key:value 都顯示和序列化,但對于用戶,我只想要一個 List 鍵,或者如果它更簡單,保留 Map 但只顯示鍵和所有值切換到 '** **' 4 個星號什么的。我想過有兩個 getter,但 JsonView 注釋不像兩個 getter 可以有不同的視圖,而 Jackson 知道要調用哪一個。我不確定 JsonView 是這里最好的東西。也許是基于視圖或一些自定義序列化程序進行序列化的 JsonGetter 方法,但我認為可能有一種更直接的方法來使用 Jackson 和少量注釋我想做的是:Person.javaMap<String,String> secrets;這將序列化為(對于管理員):{"person":{  "secrets":{     "password":"123456",     "creditCard":"1234 5678 9101"   } }}這將序列化為(對于用戶):{"person":{  "secrets":{     "password":"****",     "creditCard":"****"   } }}但是我想我能做的就是@JsonView(View.User.class)Map<String,String> getSecrets(){  this.secrets.forEach(value -> "****") //code would be different but basically setting all values to ****  return secrets;}@JsonView(View.Admin.class)Map<String,String> getSecrets(){  //Returning secrets as they should be  return secrets;}
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

您可以嘗試為對象映射器定義一個自定義序列化器,這樣每當對象映射器用于序列化時,您就可以檢查密碼和信用卡字段并將其轉換為您選擇的值。例如


public class ItemSerializer extends StdSerializer<Item> {


    public ItemSerializer() {

        this(null);

    }


    public ItemSerializer(Class<Item> t) {

        super(t);

    }


    @Override

    public void serialize(

      Item value, JsonGenerator jgen, SerializerProvider provider) 

      throws IOException, JsonProcessingException {


        jgen.writeStartObject();

        jgen.writeNumberField("id", value.id);

        jgen.writeStringField("itemName", value.itemName);

        jgen.writeNumberField("owner", value.owner.id);

        jgen.writeEndObject();

    }

}

然后,您可以提供一個使用此自定義序列化程序的對象映射器,


Item myItem = new Item(1, "theItem", new User(2, "theUser"));

ObjectMapper mapper = new ObjectMapper();


SimpleModule module = new SimpleModule();

module.addSerializer(Item.class, new ItemSerializer());

mapper.registerModule(module);


String serialized = mapper.writeValueAsString(myItem);

在您的情況下,您可以在 spring 上下文中使用自定義序列化程序注冊 objectmapper bean,并讓 jackson 使用您的 object mapper bean。


或使用@JsonSerialize如下注釋:


public class Event {

    public String name;


    @JsonSerialize(using = CustomDateSerializer.class)

    public Date eventDate;

}



Public class CustomDateSerializer extends StdSerializer<Date> {


    private static SimpleDateFormat formatter 

      = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");


    public CustomDateSerializer() { 

        this(null); 

    } 


    public CustomDateSerializer(Class<Date> t) {

        super(t); 

    }


    @Override

    public void serialize(

      Date value, JsonGenerator gen, SerializerProvider arg2) 

      throws IOException, JsonProcessingException {

        gen.writeString(formatter.format(value));

    }

}


查看完整回答
反對 回復 2022-11-02
  • 1 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號