当我使用com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(payload)从一个对象获取一个json字符串时,我发现一些字段有星号而不是值。如下所示:
{
"id": "25495867-1404-412d-9488-ce495bd468de",
"createdDate": "2019-09-01T22:27:46.000Z",
"updatedDate": "2019-09-01T22:27:46.000Z",
"externalKey": "testhc1",
"email": **********************,
"name": ************,
"currency": "NZD"
}email和name在我的有效负载对象中都有值,我看不出这些字段有什么奇怪的地方。但是很明显,jackson代码是这样的。不仅值是模糊的,而且产生的星号没有在引号中,因此对于这个过程的另一端成功解析来说,它们不是有效的json。
有人知道是什么引发了这种行为吗?我花了一天时间看代码却什么也没发现。未对有效负载对象进行注释,但我尝试了其他工作良好的未注释对象。
编辑1029/09/03我正在编写的代码是一个用于基尔比尔的插件,在该环境之外运行时,它的行为似乎有所不同。我写了一个小测试:
UUID accountId = UUID.fromString("25495867-1404-412d-9488-ce495bd468de");
DefaultAccount account = new DefaultAccount(
accountId, "external", "abc@gmail.com",
"fred smith", 4, Currency.NZD, null, false,
20, null, new DateTime(), DateTimeZone.UTC,
Locale.getDefault().toString(), "addr1",
"addr2", "companyName", "city",
"stateOrProvince", "country",
"postalCode", "phone", "notes", false);
try {
String json = invoiceNotificationHttpClient.getMapper().writeValueAsString(account);
logger.info("testMapper: {} " ,json);
} catch (JsonProcessingException e) {
logger.error(e.getMessage(),e);
}直接(在KillBill外)运行测试的结果给出了我期望的结果
{
"id": "25495867-1404-412d-9488-ce495bd468de",
"externalKey": "external",
"email": "abc@gmail.com",
"name": "fred smith",
"firstNameLength": 4,
"currency": "NZD",
...
}我取了这个确切的代码,并将它粘贴到我的插件中。您可以看到,我只是实例化一个类并在其上运行映射器。当作为插件运行时,结果是:
{
"id": "25495867-1404-412d-9488-ce495bd468de",
"externalKey": "external",
"email": ***************,
"name": ************,
"firstNameLength": 4,
"currency": "NZD",
...
}这是我的星号。所以它不是类本身,它看起来可能是映射器。所以我看了看。
映射器确实来自于框架,但我有它的来源。我扩展了给定的类org.killbill.billing.plugin.util.http.HttpClient以生成InvoiceNotificationHttpClient。所以在我的课上有一种方法:
protected ObjectMapper createObjectMapper() {
return super
.createObjectMapper()
.registerModule(new JodaModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
} 这是调用超类并添加我对Joda所需的内容。在超级阶级中:
protected ObjectMapper createObjectMapper() {
final ObjectMapper mapper = new ObjectMapper();
// Tells the serializer to only include those parameters that are not null
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// Allow special characters
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
// Write dates using a ISO-8601 compliant notation
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return mapper;
}我觉得很高兴。无论如何,这应该和我在独立运行时的情况一样。
再编辑2019-09-03
当我作为插件运行时,我开始认为我一定得到了一个不同的ObjectMapper。我将上述ObjectMapper的实例化和配置移到插件中的自己的方法中,并作为测试进行了尝试。同样的技术仍然很好地独立工作,而且在插件中不起作用。因此,new ObjectMapper()似乎给了我一些不同的东西在这些环境中。这可能是现在的OSGi问题了。我会更新标签。
发布于 2019-09-03 23:06:32
这是一条彻头彻尾的红鲱鱼,但我会贴出答案,以防它对别人有帮助。星号并不是由杰克逊ObjectMapper的任何奇怪之处引起的。它们也不是由OSGi配置中的任何奇怪的类路径问题引起的。我花了很长时间来寻找这些问题,却一无所获。
它们是由logback配置中的一个logback造成的,该配置旨在掩盖这些特定字段在日志中出现的情况。这是一个合理的要求,但我不知道我正在嵌入的服务器--我的OSGi插件就是这样做的。结果,当我关闭转换时,字段就很好了。当我运行桌面测试时,它们有一个更简单的logback配置,不包括conversionRule,因此它从未出现在那里。
https://stackoverflow.com/questions/57754266
复制相似问题