Создание блога (Серия из 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 Listcategories; 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 ListgetPost() { 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”