反序列化 guava optional<long> 失败
Deserializing guava optional<long> is failing
我正在使用 jackson(版本:2.9.4)序列化一个可选的 guava。
当我反序列化时,出现以下异常:
Cannot deserialize instance of 'java.lang.Long' out START_OBJECT token.
当我在反序列化期间调试该值时,我注意到该值以 "Optional(present=true)" 的形式出现,而不是 Optional.
中存在的值
我查看了对象映射器,"GuavaModule()" 已经在对象映射器中注册了。
如果我遗漏了什么,请告诉我。
随着注册
的GuavaModule
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
</dependency>
...以及以下 bean...
import com.google.common.base.Optional;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class GuavaBean {
private Optional<Long> abc;
}
…这给了我一个绿色测试…
import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
[…]
@Test
public void guava() throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new GuavaModule());
GuavaBean bean = new GuavaBean(Optional.of(9l));
String beanSerialized = objectMapper.writeValueAsString(bean);
assertThat(beanSerialized).isEqualTo("{\"abc\":9}");
GuavaBean optLong = objectMapper.readValue(beanSerialized, GuavaBean.class);
assertThat(optLong.getAbc().get()).isEqualTo(9);
}
但是,如果我不小心使用 java.util.Optional
而不是 com.google.common.base.Optional
,那么行为就和你写的一模一样。
我正在使用 jackson(版本:2.9.4)序列化一个可选的 guava。
当我反序列化时,出现以下异常:
Cannot deserialize instance of 'java.lang.Long' out START_OBJECT token.
当我在反序列化期间调试该值时,我注意到该值以 "Optional(present=true)" 的形式出现,而不是 Optional.
中存在的值我查看了对象映射器,"GuavaModule()" 已经在对象映射器中注册了。 如果我遗漏了什么,请告诉我。
随着注册
的GuavaModule<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
</dependency>
...以及以下 bean...
import com.google.common.base.Optional;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class GuavaBean {
private Optional<Long> abc;
}
…这给了我一个绿色测试…
import static org.assertj.core.api.Assertions.assertThat;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
[…]
@Test
public void guava() throws JsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new GuavaModule());
GuavaBean bean = new GuavaBean(Optional.of(9l));
String beanSerialized = objectMapper.writeValueAsString(bean);
assertThat(beanSerialized).isEqualTo("{\"abc\":9}");
GuavaBean optLong = objectMapper.readValue(beanSerialized, GuavaBean.class);
assertThat(optLong.getAbc().get()).isEqualTo(9);
}
但是,如果我不小心使用 java.util.Optional
而不是 com.google.common.base.Optional
,那么行为就和你写的一模一样。