Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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
Mongodb多态性Java对象无法确定具体类_Java_Mongodb_Polymorphism_Micronaut - Fatal编程技术网

Mongodb多态性Java对象无法确定具体类

Mongodb多态性Java对象无法确定具体类,java,mongodb,polymorphism,micronaut,Java,Mongodb,Polymorphism,Micronaut,我将Mongodb与Micronaut一起使用,读取多态Java对象会给我带来错误,因为Mongodb无法根据其类型确定具体的实现类 myPet: { "_id" : ObjectId("5f96f4633dbd690c548c2a38"), pets: [{"type" : "Cat" }, {"type" : "Dog" }]} public class MyPet {

我将Mongodb与Micronaut一起使用,读取多态Java对象会给我带来错误,因为Mongodb无法根据其类型确定具体的实现类

myPet: { "_id" : ObjectId("5f96f4633dbd690c548c2a38"), pets: [{"type" : "Cat" }, {"type" : "Dog" }]}

public class MyPet {
  private List<Animal> pets = new ArrayList<Animal>(0);

  public List<Animal> getPets() {
    return pets;
  }

  public void setPets(List<Animal> pets) {
    this.pets = pets;
  }
}

public class Cat implements Animal {
  private String type = "Cat";

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }
}

public class Dog implements Animal {
  private String type = "Dog";

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }
}

public interface Animal {
  String getType();
}

您可以使用
@BsonDiscriminator
注释告诉MongoDB驱动程序哪个字段用作鉴别器键。以下是一个工作示例:

import org.bson.codecs.pojo.annotations.BsonDiscriminator;
@B声带识别器(键=动物。识别器\U键)
公共界面动物{
字符串鉴别器\u KEY=“type”;
字符串getType();
}
公营猫科动物{
@凌驾
公共字符串getType(){
返回Cat.class.getName();
}
}
公营狗具动物{
@凌驾
公共字符串getType(){
返回Dog.class.getName();
}
}

如您所见,我使用完整的类名作为
type
字段的值。不幸的是,自定义鉴别器值(与完整类名不同)现在在Micronaut MongoDB客户端中还不能工作。这是因为这个问题仍未解决:

您可以使用
@BsonDiscriminator
注释告诉MongoDB驱动程序哪个字段用作鉴别器密钥。以下是一个工作示例:

import org.bson.codecs.pojo.annotations.BsonDiscriminator;
@B声带识别器(键=动物。识别器\U键)
公共界面动物{
字符串鉴别器\u KEY=“type”;
字符串getType();
}
公营猫科动物{
@凌驾
公共字符串getType(){
返回Cat.class.getName();
}
}
公营狗具动物{
@凌驾
公共字符串getType(){
返回Dog.class.getName();
}
}

如您所见,我使用完整的类名作为
type
字段的值。不幸的是,自定义鉴别器值(与完整类名不同)现在在Micronaut MongoDB客户端中还不能工作。这是因为这个问题仍未解决:

我对数据库没有经验,但对
if(obj.type==“Dog”)
的回答我对数据库没有经验,但对
if(obj.type==“Dog”)
的回答是
MongoCollection<MyPet> myPetColl = db.getCollection("myPet", MyPet.class);
myPetColl.find()
Unexpected error occurred: An exception occurred when decoding using the AutomaticPojoCodec.
Decoding into a 'MyPet' failed with the following exception:

Failed to decode 'MyPet'. Decoding 'content' errored with: Cannot find a public constructor for 'Animal'.

A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
org.bson.codecs.configuration.CodecConfigurationException: An exception occurred when decoding using the AutomaticPojoCodec.
Decoding into a 'MyPet' failed with the following exception:

Failed to decode 'MyPet'. Decoding 'content' errored with: Cannot find a public constructor for 'Animal'.

A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
        at org.bson.codecs.pojo.AutomaticPojoCodec.decode(AutomaticPojoCodec.java:40)
        at com.mongodb.internal.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52)
        at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:60)
        at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
        at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
        at org.bson.internal.LazyCodec.decode(LazyCodec.java:48)
        at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
        at com.mongodb.internal.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:63)
        at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
        at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
        at com.mongodb.internal.connection.ReplyMessage.<init>(ReplyMessage.java:51)
        at com.mongodb.internal.connection.InternalStreamConnection.getCommandResult(InternalStreamConnection.java:412)
        at com.mongodb.internal.connection.InternalStreamConnection.access$900(InternalStreamConnection.java:75)
        at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:397)
        at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:375)
        at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:676)
        at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:643)
        at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:513)
        at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:510)
        at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:230)
        at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:213)
        at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127)
        at java.base/sun.nio.ch.Invoker.invokeDirect(Invoker.java:158)
        at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.implRead(UnixAsynchronousSocketChannelImpl.java:560)
        at java.base/sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:277)
        at java.base/sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:298)
        at com.mongodb.internal.connection.AsynchronousSocketChannelStream$AsynchronousSocketChannelAdapter.read(AsynchronousSocketChannelStream.java:136)
        at com.mongodb.internal.connection.AsynchronousChannelStream.readAsync(AsynchronousChannelStream.java:109)
        at com.mongodb.internal.connection.InternalStreamConnection.readAsync(InternalStreamConnection.java:510)
        at com.mongodb.internal.connection.InternalStreamConnection.access$1000(InternalStreamConnection.java:75)
        at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:633)
        at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:618)
        at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:513)
        at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:510)
        at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:230)
        at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:213)
        at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127)
        at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishRead(UnixAsynchronousSocketChannelImpl.java:437)
        at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:191)
        at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213)
        at java.base/sun.nio.ch.KQueuePort$EventHandlerTask.run(KQueuePort.java:312)
        at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "Dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "Cat"),
})