如何让Jackson mixin处理包含的类型?

时间:2020-02-13 12:55:09

标签: java jackson

我正在使用Jackson混合插件仅序列化特定字段。

我的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();
}

但是,我的测试表明TransactionLog的person属性没有通过。

@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。所以一定有问题我如何配置mixin ...否则我误会了一些东西。

那么任何人都可以帮助指出我该怎么做才能导出我的mixin子类型“人”吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

最后弄清楚了问题所在。现在,测试将打印出我们想要的内容:

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

错误出在TransactionLogExport中。它需要说:

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

代替:

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

即该方法需要以“ get”开始。