为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号