Johan
Johan

Reputation: 40558

How to specify a ReadConcern to use with Spring's MongoTemplate?

With the vanilla java MongoClient you can specify a read concern for a particular query for example like this:

var result = mongoClient.getDatabase("somedb")
                        .getCollection("collection")
                        .withReadConcern(ReadConcern.MAJORITY)
                        .find(..)

But I cannot seem to find a way to set the ReadConcern using Spring's MongoTemplate. Preferably I'd like to set it for a specific query, but if this is not possible I'm fine with configuring something equivalent to a WriteConcernResolver (but for read concerns).

Is this possible, and if so how?

I'm using spring-data-mongodb version 3.2.6.

Upvotes: 1

Views: 2516

Answers (1)

jcompetence
jcompetence

Reputation: 8393

It seems that you maybe able to set this on the TransactionOptions and MongoTransactionManager:

https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/MongoTransactionManager.html

Example:

TransactionOptions transactionOptions = TransactionOptions.builder().readConcern(ReadConcern.LOCAL).writeConcern(WriteConcern.W1).build();
return new MongoTransactionManager(dbFactory.getMongoDatabaseFactory(), transactionOptions);

=== Edited ===

How about we take it the MongoClient route, since you stated it works on it? We could create a MongoTemplate from a given MongoClient instance:

Example:

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;

@Configuration
public class DemoApplication extends AbstractMongoClientConfiguration {

    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), "someDbName");
    }

    @Override
    public MongoClient mongoClient() {
        final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/someDbName");

        MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .readConcern(ReadConcern.DEFAULT)
                .writeConcern(WriteConcern.MAJORITY)
                .readPreference(ReadPreference.primary()).build();

        return MongoClients.create(mongoClientSettings);
    }

    @Override
    protected String getDatabaseName() {
        return "someDbName";
    }
}

Upvotes: 2

Related Questions