反序列化番石榴可选<long>失败



我正在使用杰克逊序列化guava可选(版本:2.9.4(。

当我进行挑选时,我要低于例外:

Cannot deserialize instance of 'java.lang.Long' out START_OBJECT token.

当我在测试期间调试值时,我注意到该值以"可选(prange = true("而不是可选的值。

我查看了对象映射器," guavamodule(("已经在对象映射器上注册。请让我知道我是否缺少任何东西。

在注册

的guavamodule中
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-guava</artifactId>
</dependency>

…和以下豆…

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,那么Beahviour就像您写的一样。

最新更新