import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.bson.types.ObjectId;

import java.util.concurrent.TimeUnit;

import static org.bson.codecs.pojo.Conventions.DEFAULT_CONVENTIONS;

public class TestMongoJiraStringIdMain {

    public static void main(String[] args) {
        String mongoUri = "mongodb://localhost:27017";
        String database = "test";

        MongoClient mongoClient = buildMongoClient(mongoUri);
        MongoDatabase mongoDatabase = mongoClient.getDatabase(database);
        MongoCollection<TestModel> test = mongoDatabase.getCollection("test", TestModel.class);
        test.drop();
        test.insertOne(new TestModel(null, 1, "123"));
        test.insertOne(new TestModel(new ObjectId().toHexString(), 1, "123"));
        test.insertOne(new TestModel("123", 1, "123"));

        for (TestModel testModel : test.find()) {
            System.out.println(testModel);
        }
        for (Document doc : mongoDatabase.getCollection("test").find()) {
            System.out.println(doc.toJson());
        }
    }

    public static MongoClient buildMongoClient(String mongoUri) {
        final CodecRegistry pojoRegistry = CodecRegistries.fromProviders(PojoCodecProvider.builder()
                .automatic(true)
                .conventions(DEFAULT_CONVENTIONS)
                .build()
        );

        final CodecRegistry registries = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(), pojoRegistry);

        final MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder()
                .codecRegistry(registries)
                .connectTimeout((int) TimeUnit.MINUTES.toMillis(5));

        return new MongoClient(new MongoClientURI(mongoUri, optionsBuilder));
    }

    public static class TestModel {
        public String _id;
        public int id;
        public String name;

        public TestModel(){}

        public TestModel(String _id, int id, String name) {
            this._id = _id;
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "TestModel{" +
                    "_id='" + _id + '\'' +
                    ", id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
}