Как заставить Джексона Миксина обрабатывать включенный тип? - PullRequest
0 голосов
/ 13 февраля 2020

Я использую миксины Джексона только для сериализации из определенных c полей.

Мой ObjectMapper настроен так:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.addMixIn(Person.class, SyncPerson.class);
mapper.addMixIn(TransactionLog.class, TransactionLogExport.class);

Вот классы моделей в паре с JSON объекты mixin, которые я хотел бы экспортировать:

// Model class
public class Person {
    private Long id;
    private String email;
    private String firstName;
    private String lastName;
}

// Desired JSON format.  Excludes 'id' field
public interface SyncPerson {

    @JsonProperty("firstName")
    String getFirstName();

    @JsonProperty("lastName")
    String getLastName();

    @JsonProperty("email")
    String getEmail();
}


// Model class
public class TransactionLog {
    private long id;
    private Integer version;
    private Person person;
    private Date date;
    private EntityAction action;
}

// Desired JSON format.  Excludes 'id' field, 'version', 'date'
public interface TransactionLogExport {

    @JsonProperty("id")
    String getId();

    @JsonProperty("person")
    Person person();

    @JsonProperty("action")
    EntityAction getAction();
}

Тем не менее, мои тесты показывают, что атрибут person TransactionLog не проходит.

@Test
public void testWriteValue() throws Exception {
    Person person = new Person();
    person.setEmail("a@c.com");
    person.setFirstName("A");
    person.setLastName("C");

    TransactionLog log = new TransactionLog();
    log.setId(0L);
    log.setAction(EntityAction.CREATE);
    log.setPerson(person);
    log.setStartValue("start");
    log.setEndValue("end");
    log.setChanges("change");

    String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(log); 
    System.out.println(prettyJson);
    // Prints:
    // {
    //   "id" : 0,
    //   "action" : "CREATE",
    }
}

Если я попробую тот же тест с обычным ObjectMapper mapper = new ObjectMapper(); вместо mixin, то я увижу полный экспортированный объект, включая Person с электронной почтой, именами и т. Д. c. Так что, должно быть, что-то не так с тем, как я настроил миксин ... или я что-то неправильно понимаю.

Так что кто-нибудь может помочь указать, что я могу сделать, чтобы экспортировать подтип 'person' в мой миксин ?

Спасибо!

1 Ответ

1 голос
/ 13 февраля 2020

Наконец-то разобрался с проблемой. Теперь тест печатает то, что мы хотим:

{
  “id” : 0,
  “person” : {
    “email” : “a@c.com”,
    “firstName” : “A”,
    “lastName” : “C”
  },
  “action” : “CREATE”
}

Ошибка была в TransactionLogExport. Нужно сказать:

@JsonProperty("person")
Person getPerson();

Вместо:

@JsonProperty("person")
Person person();

Т.е. метод должен начинаться с 'get'.

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