MongoBlobStore использует неправильный кодек - PullRequest
0 голосов
/ 11 марта 2020

В моем проекте дуб крольчатый со следующими зависимостями

        <dependency>
        <groupId>org.apache.jackrabbit</groupId>
        <artifactId>oak-jcr</artifactId>
        <version>1.24.0</version>
    </dependency>
    <dependency>
        <groupId>javax.jcr</groupId>
        <artifactId>jcr</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.jackrabbit</groupId>
        <artifactId>oak-store-document</artifactId>
        <version>1.24.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

Хранилище инициализируется как пружинный компонент следующим образом:

DocumentNodeStore documentNodeStore;

@Bean
@Profile("mongoFileStorage")
public Repository mongoContentRepository(MongoClient client) throws IOException {
    DocumentNodeStore documentNodeStore = new MongoDocumentNodeStoreBuilder()
            .setMongoDB(client, "file", 0).build();
    return new Jcr(new Oak(documentNodeStore)).createRepository();
}

@PreDestroy
public void shutdown() {
    if (documentNodeStore != null) {
        documentNodeStore.dispose();
    }
}

Затем я сохраняю файл в хранилище. Я вижу, что BLOB-объекты и узлы хранятся в базе данных mon go. После перезапуска приложения я пытаюсь получить сохраненные файлы и получить следующее исключение

Caused by: java.lang.UnsupportedOperationException: The BsonCodec can only encode to Bson
at org.bson.codecs.BsonCodec.decode(BsonCodec.java:48) ~[bson-3.11.1.jar:na]
at org.bson.codecs.BsonCodec.decode(BsonCodec.java:33) ~[bson-3.11.1.jar:na]
at com.mongodb.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:60) ~[mongodb-driver-core-3.11.1.jar:na]
at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84) ~[bson-3.11.1.jar:na]
at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41) ~[bson-3.11.1.jar:na]
at org.bson.codecs.configuration.LazyCodec.decode(LazyCodec.java:47) ~[bson-3.11.1.jar:na]
at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101) ~[bson-3.11.1.jar:na]
at com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:63) ~[mongodb-driver-core-3.11.1.jar:na]
at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84) ~[bson-3.11.1.jar:na]
at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41) ~[bson-3.11.1.jar:na]
at com.mongodb.internal.connection.ReplyMessage.<init>(ReplyMessage.java:51) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.getCommandResult(InternalStreamConnection.java:413) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:309) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:259) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:99) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:450) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:72) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:218) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:269) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:131) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:123) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.CommandOperationHelper.executeCommand(CommandOperationHelper.java:343) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.CommandOperationHelper.executeCommand(CommandOperationHelper.java:334) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.CommandOperationHelper.executeCommandWithConnection(CommandOperationHelper.java:220) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.FindOperation$1.call(FindOperation.java:731) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.FindOperation$1.call(FindOperation.java:725) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:463) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.FindOperation.execute(FindOperation.java:725) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.operation.FindOperation.execute(FindOperation.java:89) ~[mongodb-driver-core-3.11.1.jar:na]
at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:189) ~[mongodb-driver-3.11.1.jar:na]
at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:143) ~[mongodb-driver-3.11.1.jar:na]
at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:92) ~[mongodb-driver-3.11.1.jar:na]
at com.mongodb.client.internal.MongoIterableImpl.forEach(MongoIterableImpl.java:121) ~[mongodb-driver-3.11.1.jar:na]
at com.mongodb.client.internal.MongoIterableImpl.into(MongoIterableImpl.java:133) ~[mongodb-driver-3.11.1.jar:na]
at org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobStore.getBlob(MongoBlobStore.java:234) ~[oak-store-document-1.24.0.jar:1.24.0]
at org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobStore.readBlockFromBackend(MongoBlobStore.java:153) ~[oak-store-document-1.24.0.jar:1.24.0]
at org.apache.jackrabbit.oak.spi.blob.AbstractBlobStore.load(AbstractBlobStore.java:507) ~[oak-blob-1.24.0.jar:1.24.0]

Похоже, mon go использует код по умолчанию c вместо MongoBlobCode c, который зарегистрирован в MongoBlobStore.

Код сохранения файла

        Node contentNode = fileNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
        contentNode.setProperty(Property.JCR_MIMETYPE, fileSource.getContentType());
        contentNode.setProperty(Property.JCR_DATA, session.getValueFactory().createBinary(new FileInputStream(fileSource.getFile())));
        session.save();

Код получения файла

JcrUtils.readFile(node)

Исключение возникает при чтении входного потока, возвращенного с JcrUtils.readFile

...