如何让杰克逊混音处理包含的类型?



我正在使用Jackson mixins来仅序列化特定字段。

我的对象映射器是这样配置的:

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属性没有通过。

@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。 所以我配置混合的方式一定有问题......否则我误解了什么。

那么谁能帮助指出我可以做些什么来导出我的混音中的子类型"人"?

谢谢!

终于想通了问题。 测试现在打印我们想要的内容:

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

错误在于TransactionLogExport. 它需要说:

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

而不是:

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

即该方法需要以"get"开头。

最新更新