В моем проекте дуб крольчатый со следующими зависимостями
<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