【发布时间】:2020-09-06 01:34:36
【问题描述】:
我正在尝试使以下示例正常工作:
@Value
@JsonDeserialize(builder = SomeClass.Builder.class)
@Builder(builderClassName = "Builder")
public static class SomeClass {
@Wither
ImmutableList<String> words;
@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
}
}
@Test
@SneakyThrows
public void serializeTest() {
ObjectMapper objectMapper = new ObjectMapper();
SomeClass someClass = SomeClass.builder()
.words(ImmutableList.of("word1", "word2", "word3"))
.build();
String jsonString = objectMapper.writeValueAsString(someClass);
log.info("serialized: {}", jsonString);
SomeClass newSomeClass = objectMapper.readValue(jsonString, SomeClass.class);
log.info("done");
newSomeClass.words.forEach(w -> log.info("word {}", w));
}
但是它失败了
Caused by: java.lang.IllegalArgumentException: Cannot find a deserializer for non-concrete Collection type [collection type; class com.google.common.collect.ImmutableList, contains [simple type, class java.lang.String]]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:1205)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:399)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
来自this answer,我尝试了类似:
@Value
@JsonDeserialize(builder = SomeClass.Builder.class)
@Builder(builderClassName = "Builder")
public static class SomeClass {
@Wither
@JsonDeserialize(using = ImmutableListDeserializer.class)
ImmutableList<String> words;
@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
}
}
@Test
@SneakyThrows
public void serializeTest() {
ObjectMapper objectMapper = new ObjectMapper();
SomeClass someClass = SomeClass.builder()
.words(ImmutableList.of("word1", "word2", "word3"))
.build();
String jsonString = objectMapper.writeValueAsString(someClass);
log.info("serialized: {}", jsonString);
SomeClass newSomeClass = objectMapper.readValue(jsonString, SomeClass.class);
log.info("done");
newSomeClass.words.forEach(w -> log.info("word {}", w));
}
但是失败了:
Caused by: java.lang.IllegalArgumentException: Cannot find a deserializer for non-concrete Collection type [collection type; class com.google.common.collect.ImmutableList, contains [simple type, class java.lang.String]]
由于我正在处理的项目的限制,我无法修改对象映射器。 所以我不能简单地这样做:
objectMapper.registerModule(new GuavaModule());
这本来可以的。
还有其他直接的方法可以让简单的 ImmutableList 反序列化工作吗?
编辑:我设法得到了一个不同的错误:
@Value
@JsonDeserialize(builder = SomeClass.Builder.class)
@Builder(builderClassName = "Builder")
public static class SomeClass {
@Wither
ImmutableList<String> strings;
@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
@JsonDeserialize(using = ImmutableListDeserializer.class)
public Builder strings(ImmutableList<String> strings) {
this.strings = strings;
return this;
}
}
}
@Test
@SneakyThrows
public void serializeTest() {
ObjectMapper objectMapper = new ObjectMapper();
SomeClass someClass = SomeClass.builder()
.strings(ImmutableList.of("word1", "word2", "word3"))
.build();
String jsonString = objectMapper.writeValueAsString(someClass);
log.info("serialized: {}", jsonString);
SomeClass newSomeClass = objectMapper.readValue(jsonString, SomeClass.class);
log.info("done");
newSomeClass.strings.forEach(w -> log.info("word {}", w));
}
抛出:
Caused by: java.lang.IllegalArgumentException: Class com.fasterxml.jackson.datatype.guava.deser.ImmutableListDeserializer has no default (no arg) constructor
如果我可以为 ImmutableListDeserializer 或类似的东西构建一个无参数构造函数,这可能更容易解决
【问题讨论】:
标签: java java-8 jackson deserialization lombok