Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 Quarkus Mongodb在本机构建中更改流NullPointerException_Java_Mongodb_Quarkus_Reactive_Reactive Mongo Java - Fatal编程技术网

Java Quarkus Mongodb在本机构建中更改流NullPointerException

Java Quarkus Mongodb在本机构建中更改流NullPointerException,java,mongodb,quarkus,reactive,reactive-mongo-java,Java,Mongodb,Quarkus,Reactive,Reactive Mongo Java,我正在构建一个quarkus应用程序,该应用程序将mongodb更改流功能用于反应式客户端 如果我从Intellij本地启动应用程序,一切正常,但是当我构建本机应用程序并在docker映像中运行它时,我会收到此错误 2021-05-24 14:32:51,983 INFO [org.mon.dri.connection] (main) Opened connection [connectionId{localValue:13, serverValue:220678}] to cluster0-s

我正在构建一个quarkus应用程序,该应用程序将mongodb更改流功能用于反应式客户端

如果我从Intellij本地启动应用程序,一切正常,但是当我构建本机应用程序并在docker映像中运行它时,我会收到此错误

2021-05-24 14:32:51,983 INFO [org.mon.dri.connection] (main) Opened connection [connectionId{localValue:13, serverValue:220678}] to cluster0-shard-00-02.plt2x.mongodb.net:27017
2021-05-24 14:32:52,146 INFO [org.mon.dri.connection] (main) Closed connection [connectionId{localValue:13, serverValue:220678}] to cluster0-shard-00-02.plt2x.mongodb.net:27017 because the pool has been closed.
2021-05-24 14:32:52,197 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.lang.NullPointerException
at com.mongodb.client.model.changestream.ChangeStreamDocumentCodec.<init>(ChangeStreamDocumentCodec.java:45)
at com.mongodb.client.model.changestream.ChangeStreamDocument.createCodec(ChangeStreamDocument.java:296)
at com.mongodb.reactivestreams.client.internal.ChangeStreamPublisherImpl.<init>(ChangeStreamPublisherImpl.java:65)
at com.mongodb.reactivestreams.client.internal.MongoCollectionImpl.watch(MongoCollectionImpl.java:277)
at io.quarkus.mongodb.impl.ReactiveMongoCollectionImpl.watch(ReactiveMongoCollectionImpl.java:360)
at com.teascanner.eventmanager.event.EventService.initOrderStream(EventService.java:89)
at com.teascanner.eventmanager.event.EventService.init(EventService.java:46)
at com.teascanner.eventmanager.event.EventService_Bean.create(EventService_Bean.zig:376)
at com.teascanner.eventmanager.event.EventService_Bean.create(EventService_Bean.zig:392)
at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:96)
at io.quarkus.arc.impl.AbstractSharedContext.access$000(AbstractSharedContext.java:14)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:29)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:26)
at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:26)
at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:17)
at com.teascanner.eventmanager.event.EventService_ClientProxy.arc$delegate(EventService_ClientProxy.zig:67)
at com.teascanner.eventmanager.event.EventService_ClientProxy.arc_contextualInstance(EventService_ClientProxy.zig:82)
at com.teascanner.eventmanager.event.EventService_Observer_Synthetic_d70cd75bf32ab6598217b9a64a8473d65e248c05.notify(EventService_Observer_Synthetic_d70cd75bf32ab6598217b9a64a8473d65e248c05.zig:94)
at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:283)
at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:268)
at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:70)
at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:128)
at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:97)
at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(LifecycleEventsBuildStep$startupEvent1144526294.zig:87)
at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(LifecycleEventsBuildStep$startupEvent1144526294.zig:40)
at io.quarkus.runner.ApplicationImpl.doStart(ApplicationImpl.zig:609)
at io.quarkus.runtime.Application.start(Application.java:90)
at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:100)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:66)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:42)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:119)
at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:29)
这是我初始化变更流并启动集合监视的类和方法

@Inject
ReactiveMongoClient mongoClient;

private void initOrderStream() {
    ReactiveMongoDatabase database = mongoClient.getDatabase("database");
    ReactiveMongoCollection<Order> dataCollection = database.getCollection("order", Order.class);
    ChangeStreamOptions options = new ChangeStreamOptions().fullDocument(FullDocument.UPDATE_LOOKUP);


    List<Bson> pipeline = Collections.singletonList(
            Aggregates.match(
                    Filters.and(
                            Filters.eq("operationType", "update"),
                            Filters.eq("updateDescription.updatedFields.orderStatus", "PENDING")
                    )
            )
    );

    Multi<ChangeStreamDocument<Order>> publisher = dataCollection.watch(pipeline, Order.class, options);
    publisher.subscribe().with(eventListener.getOrderListener());
}
@Inject
反应性mongoClient mongoClient;
私有void initOrderStream(){
ReactiveMongoDatabase数据库=mongoClient.getDatabase(“数据库”);
ReactiveMongoCollection dataCollection=database.getCollection(“order”,order.class);
ChangeStreamOptions=new ChangeStreamOptions().fullDocument(fullDocument.UPDATE\u查找);
List pipeline=Collections.singletonList(
A.match(
A.和(
Filters.eq(“操作类型”、“更新”),
Filters.eq(“updateDescription.updateFields.orderStatus”,“待定”)
)
)
);
Multi-publisher=dataCollection.watch(管道、Order.class、选项);
publisher.subscribe().with(eventListener.getOrderListener());
}
这就是listener方法

public Consumer<ChangeStreamDocument<Order>> getOrderListener() {
    return message -> {
        Order order = message.getFullDocument();
        saveEvent(order);
    };
}
公共消费者getOrderListener(){
返回消息->{
订单=message.getFullDocument();
保存事件(顺序);
};
}
我不理解这个错误,查看mongo客户机库的源代码,其中有nullpointer异常,我发现错误在构造函数中

ChangeStreamDocumentCodec(final Class<TResult> fullDocumentClass, final CodecRegistry codecRegistry) {

    ClassModelBuilder<ChangeStreamDocument> classModelBuilder = ClassModel.builder(ChangeStreamDocument.class);
    ((PropertyModelBuilder<TResult>) classModelBuilder.getProperty("fullDocument")).codec(codecRegistry.get(fullDocumentClass));
    ((PropertyModelBuilder<OperationType>) classModelBuilder.getProperty("operationType")).codec(OPERATION_TYPE_CODEC);
    ClassModel<ChangeStreamDocument> changeStreamDocumentClassModel = classModelBuilder.build();

    PojoCodecProvider provider = PojoCodecProvider.builder()
            .register(MongoNamespace.class)
            .register(UpdateDescription.class)
            .register(TruncatedArray.class)
            .register(changeStreamDocumentClassModel)
            .build();

    CodecRegistry registry = fromRegistries(fromProviders(provider, new BsonValueCodecProvider()), codecRegistry);
    this.codec = (Codec<ChangeStreamDocument<TResult>>) (Codec<? extends ChangeStreamDocument>) registry.get(ChangeStreamDocument.class);
}
ChangeStreamDocumentCodec(最终类fullDocumentClass,最终编解码器注册表编解码器注册表){
ClassModelBuilder ClassModelBuilder=ClassModel.builder(ChangeStreamDocument.class);
((PropertyModelBuilder)classModelBuilder.getProperty(“fullDocument”).codec(codecRegistry.get(fullDocumentClass));
((PropertyModelBuilder)classModelBuilder.getProperty(“operationType”)).codec(操作类型编码);
ClassModel changeStreamDocumentClassModel=classModelBuilder.build();
PojoCodecProvider provider=PojoCodecProvider.builder()
.register(MongoNamespace.class)
.register(UpdateDescription.class)
.register(TruncatedArray.class)
.register(changeStreamDocumentClassModel)
.build();
CodeRegistry registry=fromRegistries(fromProviders(provider,新BSONValueCodeProvider()),CodeRegistry);

this.codec=(codec)(codec这是刚刚修复的,将在
1.13.5
2.0.0.Alpha4

中提供。非常感谢,在新版本中一切正常。对于相同的代码和场景,我现在遇到了一个新问题,我想使用message方法将resumeToken保存在listerner中。getResumeToken()ChangeStreamDocument类的,但它始终为空。您能帮助我吗?我应该打开一个新问题吗?我打开了一个新问题。
ChangeStreamDocumentCodec(final Class<TResult> fullDocumentClass, final CodecRegistry codecRegistry) {

    ClassModelBuilder<ChangeStreamDocument> classModelBuilder = ClassModel.builder(ChangeStreamDocument.class);
    ((PropertyModelBuilder<TResult>) classModelBuilder.getProperty("fullDocument")).codec(codecRegistry.get(fullDocumentClass));
    ((PropertyModelBuilder<OperationType>) classModelBuilder.getProperty("operationType")).codec(OPERATION_TYPE_CODEC);
    ClassModel<ChangeStreamDocument> changeStreamDocumentClassModel = classModelBuilder.build();

    PojoCodecProvider provider = PojoCodecProvider.builder()
            .register(MongoNamespace.class)
            .register(UpdateDescription.class)
            .register(TruncatedArray.class)
            .register(changeStreamDocumentClassModel)
            .build();

    CodecRegistry registry = fromRegistries(fromProviders(provider, new BsonValueCodecProvider()), codecRegistry);
    this.codec = (Codec<ChangeStreamDocument<TResult>>) (Codec<? extends ChangeStreamDocument>) registry.get(ChangeStreamDocument.class);
}
((PropertyModelBuilder<TResult>) classModelBuilder.getProperty("fullDocument")).codec(codecRegistry.get(fullDocumentClass));