Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClassCastException使用ObjectMapper反序列化到参数化类时,即使使用TypeReference和TypeFactory_Java_Generics_Jackson_Deserialization_Type Erasure - Fatal编程技术网

Java ClassCastException使用ObjectMapper反序列化到参数化类时,即使使用TypeReference和TypeFactory

Java ClassCastException使用ObjectMapper反序列化到参数化类时,即使使用TypeReference和TypeFactory,java,generics,jackson,deserialization,type-erasure,Java,Generics,Jackson,Deserialization,Type Erasure,尝试使用ObjectMapper对参数化类进行反序列化时出现以下异常(适用于非参数化类): 以下是原始代码: Foo<A> request = OBJECT_MAPPER.readValue(payload, Foo.class); 不过,通常我们在映射到AutoMatter生成的类时没有问题。它只是添加了似乎引起问题的参数化 有人有主意吗 编辑以回答@MichalZiober的问题: 在我的测试代码中,我实际上只是序列化我所知道的有效对象,即,然后反序列化该对象以返回我开始使用

尝试使用ObjectMapper对参数化类进行反序列化时出现以下异常(适用于非参数化类):

以下是原始代码:

Foo<A> request = OBJECT_MAPPER.readValue(payload, Foo.class);
不过,通常我们在映射到AutoMatter生成的类时没有问题。它只是添加了似乎引起问题的参数化

有人有主意吗


编辑以回答@MichalZiober的问题:

在我的测试代码中,我实际上只是序列化我所知道的有效对象,即,然后反序列化该对象以返回我开始使用的对象:

Foo<A> myExampleObject;
ByteString.encodeUtf8(OBJECT_MAPPER.writeValueAsString(myExampleObject));

POJO
结构中使用
Optional
时,需要从启用
Jdk8Module
。下面的示例显示,注册此模块后,我们可以序列化和反序列化数据:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import io.norberg.automatter.AutoMatter;
import io.norberg.automatter.jackson.AutoMatterModule;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new AutoMatterModule());
        mapper.registerModule(new Jdk8Module());

        String json = "{\"parent\":\"Aaaa\", \"children\":[\"a\"]}";
        System.out.println(mapper.readValue(json, Foo.class));


        Foo<StringWrapper> foo = new FooBuilder<StringWrapper>()
                .parent(new StringWrapperBuilder().value("PARENT").build())
                .children(Arrays.asList(new StringWrapperBuilder().value("CHILD1").build()))
                .build();
        json = mapper.writeValueAsString(foo);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Foo.class));
    }
}
@AutoMatter
interface Foo<T> {
    Optional<T> parent();
    Optional<List<T>> children();
}

@AutoMatter
interface StringWrapper {
    String value();
}

现在我不得不放弃参数化。我只上了这么多课

Foo<A>
Foo<B>
Foo<C>
Foo
福
福
只需显式地创建每一个就更容易了:

@AutoMatter
public interface FooA {
  A parent;
  List<A> children;
}

@AutoMatter
public interface FooB {
  B parent;
  List<B> children;
}

@AutoMatter
public interface FooC {
  C parent;
  List<C> children;
}
@AutoMatter
公共接口{
父母;
列出儿童名单;
}
@自动机
公共接口FooB{
B父母;
列出儿童名单;
}
@自动机
公共接口{
C父母;
列出儿童名单;
}
(我还意识到,
可选的
s是不必要的。)


不是真正的答案,所以不接受它。

注释来自哪个库
@AutoMatter
注释?您是否也可以发布示例
JSON
payload。只是为了重现给定的场景。您是否为
ObjectMapper
使用任何自定义配置?这一个:…哇。非常感谢!我可能需要一点时间来编译这个。我一定会跟进的@AndrewCheong,希望这对你有帮助。我知道这是一种观点,但有些开发者认为<代码>可选的<代码>字段在代码> POJO < /代码>中,像A.哦,这是一篇很棒的文章。是的,所以我们已经注册了JDK8模块。(请参见编辑2。)但我将尝试删除所有选项,看看会发生什么。@AndrewCheong,我注意到了您的更改。真奇怪。您需要一个非常复杂的
JSON
,而
Jackson
可能无法解析为正确的类。我的回答没有给你提供任何新的东西。删除
Optional
s可能无法解决错误。您仍然了解到反序列化类的内部结构实际上很重要。我对此一无所知。移除可选项后,我将开始简化我的模型,看看它在什么时候重新开始工作,如果有的话。
Foo<A> myExampleObject;
ByteString.encodeUtf8(OBJECT_MAPPER.writeValueAsString(myExampleObject));
  @VisibleForTesting
  public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
      .registerModule(new JodaModule())
      .registerModule(new GuavaModule())
      .registerModule(new AutoMatterModule())
      .registerModule(new Jdk8Module())
      .registerModule(new ProtobufModule())
      .setSerializationInclusion(JsonInclude.Include.NON_NULL)
      .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
      .configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false)
      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
      .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import io.norberg.automatter.AutoMatter;
import io.norberg.automatter.jackson.AutoMatterModule;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new AutoMatterModule());
        mapper.registerModule(new Jdk8Module());

        String json = "{\"parent\":\"Aaaa\", \"children\":[\"a\"]}";
        System.out.println(mapper.readValue(json, Foo.class));


        Foo<StringWrapper> foo = new FooBuilder<StringWrapper>()
                .parent(new StringWrapperBuilder().value("PARENT").build())
                .children(Arrays.asList(new StringWrapperBuilder().value("CHILD1").build()))
                .build();
        json = mapper.writeValueAsString(foo);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Foo.class));
    }
}
@AutoMatter
interface Foo<T> {
    Optional<T> parent();
    Optional<List<T>> children();
}

@AutoMatter
interface StringWrapper {
    String value();
}
Foo{parent=Optional[Aaaa], children=Optional[[a]]}
{
  "parent" : {
    "value" : "PARENT"
  },
  "children" : [ {
    "value" : "CHILD1"
  } ]
}
Foo{parent=Optional[{value=PARENT}], children=Optional[[{value=CHILD1}]]}
Foo<A>
Foo<B>
Foo<C>
@AutoMatter
public interface FooA {
  A parent;
  List<A> children;
}

@AutoMatter
public interface FooB {
  B parent;
  List<B> children;
}

@AutoMatter
public interface FooC {
  C parent;
  List<C> children;
}