Как мне сериализовать с использованием двух разных геттеров на основе JsonView в RestController? - PullRequest
1 голос
/ 30 апреля 2019

Мне нужна возможность сериализации поля в объекте на основе JsonView.Это не обязательно должен быть JsonView, это просто то, что я изучал.В основном, используя аннотацию @JsonView для класса RestController, он сериализует мой POJO.Однако у меня есть представление пользователя и администратора, где есть объект:

Секреты карты;

Что для представления администратора, я хочу, чтобы оба ключа: значение отображалось и сериализовалось, но для пользователяЯ хотел бы только получить список ключей или, если это проще, сохранить карту, но только показать ключ, и все значения переключаются на «****» 4 звездочки или что-то в этом роде.

Я думал о том, чтобы иметь два геттера, ноаннотация JsonView не работает так, когда два получателя могут иметь разные представления, и Джексон знает, какой из них вызывать.

Я не уверен, что JsonView - лучшая вещь здесь.Возможно, это метод JsonGetter, который сериализует на основе представления или какого-то другого пользовательского сериализатора, но я думаю, что может быть более простой способ сделать это с Джексоном и несколькими аннотациями

Что я хочу сделать, это:

Person.java
Map<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 Ответ

0 голосов
/ 30 апреля 2019

Можно попытаться определить пользовательский сериализатор для сопоставителя объектов, чтобы при каждом использовании сопоставителя объектов для сериализации можно было проверять и преобразовывать поле пароля и поле кредитной карты в значение, которое вы выбираете. Например,

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);

В вашем случае вы можете зарегистрировать bean-объект objectmapper с помощью настраиваемого сериализатора в контексте Spring и заставить Джексона использовать ваш bean-объект object mapper.

Или с использованием @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));
    }
}

См:

https://www.baeldung.com/jackson-json-view-annotation

https://www.baeldung.com/jackson-custom-serialization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...