Рубрики
Без рубрики

Вставка данных в MongoDB с помощью Spring Boot – Создание блога

В прошлый раз мы настроили нашу базу данных и проект Spring Boot и защитили наши учетные данные базы данных. Сейчас ,… С пометкой codenewbie, обучение, java, mongodb.

Создание блога (Серия из 8 частей)

В прошлый раз мы настроили нашу базу данных и проект Spring Boot и защитили наши учетные данные базы данных. Теперь нам нужно настроить MongoDB в нашем проекте. Затем мы можем начать вставлять данные в mongodb и получать представление о запросах для получения данных из базы данных.

Настройка Spring Boot для доступа к MongoDB

Для начала нам нужно настроить наше приложение Spring, чтобы наше приложение знало, где находится база данных для начала. Мы делаем это, добавляя следующие строки в файл application.properties в каталоге ресурсов.

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=rosafiore
spring.data.mongodb.authentication-database=admin

При настройке MongoDB мы добавили пользователя в нашу базу данных. Этот пользователь использует базу данных администратора для аутентификации и, следовательно, для доступа к другим базам данных. Вот почему нам нужно определить базу данных аутентификации, а не просто вводить учетные данные в базу данных, с которой мы будем разговаривать.

Однако нам все равно придется ввести наши защищенные учетные данные. По правде говоря, потребовалось много времени, чтобы разобраться в этом вопросе. В Интернете не было четкого ресурса, который я мог бы найти. Итак, после долгих поисков и попыток мне удалось создать конфигурацию mongo, которая вставляет защищенные учетные данные и создает подключение к базе данных.

Конфигурация Монго

Итак, давайте начнем с этого нового конфигурационного файла. Во-первых, нам нужно создать новый класс в нашем проекте. Я называю это Конфигурацией Монго , потому что он содержит конфигурацию для MongoDB. Мы должны аннотировать класс с помощью @Configuration и @EnableMongoRepositories. . Таким образом, Spring Boot знает, что это класс конфигурации, и поэтому его необходимо взять с собой во время инициализации и включения репозиториев. Кроме того, нам нужно унаследовать Абстрактная конфигурация MongoClientConfiguration для нескольких методов завершения нашей конфигурации. Итак, наш класс конфигурации теперь выглядит так:

@Configuration
@EnableMongoRepositories
public class MongoConfig extends AbstractMongoClientConfiguration {

    @Override
    protected String getDatabaseName() {
        return null;
    }
}

В этом классе мы создадим наш собственный MongoClient для вставки данных в mongodb. Для этого нам нужны свойства, которые мы определили в нашем файле application.properties . Мы можем получить доступ к свойствам, используя аннотацию spring для нашей локальной переменной: @Значение("${<имя свойства>}") . С помощью этой конструкции мы создаем наши переменные со значениями наших свойств и используем их для настройки нашего клиента. Одна из таких переменных будет выглядеть в коде следующим образом:

@Value("${spring.data.mongodb.database}")
private String database;

Как вы могли видеть немного раньше, класс конфигурации Mongo унаследовал метод getDatabaseName() . Там мы должны заменить нулевое значение на базу данных переменная. Теперь нам нужно погрузиться в настройку самого MongoClient.

Настройки монгоклиентов

После некоторых поисков я наткнулся на документацию mongodb для подключения к базе данных. Далее по странице я наконец нашел то, что искал: применение пользовательских настроек. Я решил создать отдельный частный метод для настройки параметров, чтобы поддерживать порядок. Вот код для моих настроек, и я расскажу вам о коде по ходу дела.

private MongoClientSettings setMongoClientSettings() {
    MongoCredential credential = MongoCredential.createCredential(
        Config.USERNAME, authDatabase, Config.PASSWORD);

    return MongoClientSettings.builder()
            .credential(credential)
            .applyToClusterSettings(builder ->
                    builder.hosts(Arrays.asList(new ServerAddress(host, port))))
            .build();
}

Я начинаю с определения учетных данных и базы данных аутентификации для моего клиента. Именно здесь я могу использовать свои учетные данные защищенной базы данных вместо их жесткого кодирования.

Затем следует MongoClientSettings.builder() , где создаются фактические настройки. Первое, что я делаю, это устанавливаю учетные данные на те, которые я создал ранее в методе. Далее мне нужно настроить расположение базы данных в применить к настройкам кластера . Здесь я устанавливаю хост на новый адрес сервера с номером хоста и порта. Наконец, здание может создать настройки и вернуть их. Затем настройки используются для создания MongoClient для использования в Spring Boot.

@Override
@Bean
public MongoClient mongoClient() {
    return MongoClients.create(setMongoClientSettings());
}

Итак, класс конфигурации Mongo теперь выглядит следующим образом:

@Configuration
@EnableMongoRepositories
public class MongoConfig extends AbstractMongoClientConfiguration {

    @Value("${spring.data.mongodb.host}")
    private String host;

    @Value("${spring.data.mongodb.port}")
    private int port;

    @Value("${spring.data.mongodb.database}")
    private String database;

    @Value("${spring.data.mongodb.authentication-database}")
    private String authDatabase;

    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Override
    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create(setMongoClientSettings());
    }

    private MongoClientSettings setMongoClientSettings() {
        MongoCredential credential = MongoCredential.createCredential(
            Config.USERNAME, authDatabase, Config.PASSWORD);

        return MongoClientSettings.builder()
                .credential(credential)
                .applyToClusterSettings(builder ->
                        builder.hosts(Arrays.asList(new ServerAddress(host, port))))
                .build();
    }
}

Вставка данных в MongoDB

Когда наша настройка завершена, пришло время настроить остальную часть кода для вставки данных в mongodb. Для этого нам сначала нужно создать класс, который в основном является чертежом нашего объекта. В моем случае я хочу начать с простого объекта записи в блоге и данных, которые я ожидаю в нем.

Модель Записи в блоге

Как я объяснил в разделе Выбор базы данных: SQL или NoSQL? , Мой объект записи в блоге содержит следующие свойства:

  • конечная точка
  • Дата публикации
  • Категории
  • Теги
  • Сообщение в блоге (содержание)

Я отразил эти свойства в своем классе Сообщений в блоге , который выглядит следующим образом (Я удалил геттеры и сеттеры, чтобы избежать беспорядка):

@Document(collection = "blogposts")
public class BlogPost {

    @Id
    private String documentId;
    @Indexed(unique = true)
    private String endPoint;
    private Date publishDate;
    private List categories;
    private List tags;
    private String article;
}

Как вы можете видеть, я аннотировал класс аннотацией @Document . Это позволяет мне выбрать название коллекции, в которой mongodb будет хранить мои записи в блоге. Кроме того, я создал документ с аннотацией @Id , чтобы сообщить mongodb, что это свойство будет содержать идентификатор для каждого объекта записи в блоге, хранящегося в базе данных. Наконец, я добавил аннотацию @Indexed(уникальный) к своему свойству конечной точки. Эта аннотация позволяет мне заставить mongodb проверить, действительно ли свойство уникально. В конце концов, я не хочу дублировать конечные точки для своих сообщений в блоге!

Репозиторий и контроллер записей в блоге

Когда модель завершена, пришло время вставить первое сообщение в блог в базу данных. Для этого нам сначала нужно хранилище. К счастью, это относительно просто, мне нужно только создать интерфейс, и на этом все.

При этом BlogPostRepository выглядит следующим образом:

@Repository
public interface BlogPostRepository extends MongoRepository  {
}

Вот и все для репозитория, теперь мы можем продолжить с контроллером . Контроллер содержит конечные точки для наших запросов. Я сделал этот контроллер очень простым, потому что для меня он все еще является доказательством концепции. Я создал два метода: один для публикации сообщения в блоге и один для получения сообщения в блоге. Для метода ПУБЛИКАЦИИ я жестко задал значения для записи в блоге.

Чтобы вставить данные в mongodb, я буду использовать MongoTemplate, который мне нужно только автоматически подключить к приложению следующим образом:

@Autowired
private MongoTemplate mongoTemplate;

Благодаря автоматической настройке MongoTemplate создание метода POST и GET было относительно простым и понятным.

@PostMapping
    public void createPost() {
        BlogPost blogPost = new BlogPost();
        blogPost.setEndPoint("/test");
        blogPost.setPublishDate(new Date());
        blogPost.setCategories(Arrays.asList("TestCategory"));
        blogPost.setTags(Arrays.asList("TestTag"));
        blogPost.setArticle("testPost.md");

        mongoTemplate.save(blogPost, "blogposts");
    }

    @GetMapping
    public List getPost() {
        Query query = new Query();
        query.addCriteria(Criteria.where("endPoint").is("/test"));
        return mongoTemplate.find(query, BlogPost.class);
    }
}

Конечно, единственный способ узнать наверняка – это проверить это. Итак, я зашел в “Почтальон”, вставил запросы и, наконец, после долгих дней борьбы я получаю следующий ответ при попытке получить сообщение в блоге, которое я вставил.

С этим мне наконец-то удалось вставить данные в mongodb! Теперь я могу начать с расширения внутреннего кода за счет большего количества конечных точек. Кроме того, мне нужно решить, как продолжить этот проект и какие шаги я предприму дальше.

Создание блога (Серия из 8 частей)

Оригинал: “https://dev.to/shadowphoenix/insert-data-in-mongodb-with-spring-boot-building-a-blog-29p4”