Подключаем базу данных, настраиваем Jackson. Spring Boot REST
Вставка
- Опубліковано 11 лип 2018
- Spring Boot Rest Application: Добавляем базу данных в приложение с использованием JPA (по умолчанию провайдер - Hibernate). Также мы будем использовать для сериализации объектов библиотеку Spring по-умолчанию - Jackson.
Код из видео:
github.com/drucoder/sarafan/t...
В предыдущих видео мы уже производили настройку JPA в спринг, по этой ссылке можно ознакомиться подробнее:
• Spring Boot JPA (Hiber...
Прежде всего нам нужно подключить зависимости на Spring Boot Data JPA и Postgres JDBC драйвер.
Зависимости для файла build.gradle:
gist.github.com/drucoder/59c7...
После чего мы создаём доменный объект Message.
Для уменьшения количества кода в проекте, мы будем использвать библиотеку lombok.
Видео с подробным обзором проекта lombok:
• Java Tools: Project Lo...
К сожалению, использовать его в полной мере не получится из-за проблем совместимости lombok и jackson вызванных адаптацией этих фреймворков для работы с java 9.
Настройка проперти для Postgres, исключающая ошибку в логах при старте приложения:
gist.github.com/drucoder/5bd2...
Для сокрытия лишних полей из одной сущности в разных запросах, мы будем использовать JsonView из Jackson - достаточно гибкий и мощный инструмент управления сериализуемыми данными
Скрипты для асинхронных запросов из консоли:
gist.github.com/drucoder/a1d8...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Твиттер: / letscodedru
➡ Чат в Discord: / discord
➡ Группа Вконтакте: letscodedru
➡ Канал в Telegram: t.me/letsCode_dru
➡ Чат в Telegram: t.me/joinchat/FeiP9xEhqHajfqh...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Поддержать проект:
➡ Patreon / letscodedru
➡ Яндекс.Деньги money.yandex.ru/to/4100145167...
➡ PayPal paypal.me/letscodedru
➡ Qiwi qiwi.me/letscode
➡ WebMoney/BitCoin funding.webmoney.ru/d/drucoder
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Ссылка на канал: / @letscodedru
➡ Ссылка на Яндекс.Дзен: zen.yandex.ru/media/id/5ac209... - Наука та технологія
Андрей, отдельное спасибо за работу с датой - я видел, люди такие конструкции городили, чтобы от "Т" избавиться... А у тебя все просто. С вью тоже очень интересно. В целом, твои видео самые полезные на ютубе, а я много всего посмотрел. Большое спасибо за твой труд.
Как всегда классный урок!! А последняя анотация просто космос))))
Очень удобно и полезно, что под каждым видосом есть все ссылки, в т.ч. на гитхаб репозиторий с кодом.
Доделал до конца, теперь пересматриваю - со второго раза шикарно заходит )
@JsonView крутая аннотация! Спасибо за труд! Отличные уроки!
Отлично ещё один урок переварил. ). Все работает. 👍
Как всегда все здоровско. Все по делу и ничего лишнего.
Андрей, ты крут. Спасибо за уроки
Интересная фича с представлением json. Автор хочу ещё!
Спасибище за труды! @Data - заработала, лишние зависимости тоже спилил, все работает без них
Спасибо! Отличный и лаконичный материал!
Ура новый урок!
Очень круто, спасибо!
Отличное видео. Спасибо
Для того что бы использовать @Data я поставил над классом @JsonAutoDetect и добавил в build.gradle в dependencies annotationProcessor ('org.projectlombok:lombok')
.
Еще убрал из build.gradle зависимости:
compile('javax.xml.bind:jaxb-api')
compile('com.sun.xml.bind:jaxb-core')
compile('com.sun.xml.bind:jaxb-impl')
Они не нужны, если использовать @JsonAutoDetect.
Спасибо за видео, очень интересный контент, а что вы посоветуете по работе с базой данных Orcle? какой драйвер?
Спасибо, отличное видео!
за @JsonView отдельное спасибо!
Ух ты!! Спасибо!!
Обновил Lombok Plagin до версии 0.21.2018.2 , аннотация @Data заработала. Java правда 8.
Спасибо!
Очень круто!! Когда продолжение?
Сегодня)
Андрей, если возможно сними видео как писать тесты для подобных приложений...очень надо , а долго времени изучать нет. Если можно через Mock. Спасибо!
будут тесты
Большое спасибо
Огромное спасибо за видосы! Кратко сжато качественно, а самое главное, оно компилируется. По поводу ломбок и @Data. Добавь в настройках IDEA галочку Enable annotation processing, и все заработает
И ведь точно, работает!
Спасибо
!!!
Возникла проблема с БД, запускаю код в идее, он отрабатывает без ошибок, но браузер пишет попытка соединения не удалась. В чем может быть проблема? PostgreSQL у меня установлен и на видео вы сказали, что предварительно необходимо создать БД, что именно вы имели ввиду?
Если кто-то сейчас повторяет, в Spring boot 2.3.1 возникают ошибки при попытке неявно получить объект по id в контроллере (@PathVariable(name = "id") Object entity) 6:05. В предыдущей версии (2.3.0) вроде как работает нормально.
Спасибо тебе больше, несколько дней разбирался и думал в чем проблема, а тут все заработало
Да, та же проблема. В версии 2.3.0 все работает. Спасибо за совет)
А почему не работает, есть ответ?
Андрей,скажите пожалуйста если я с браузера посылаю запрос на сервер(поиск человека по ФИО):
@PostMapping("/find")
public List Find(@RequestBody Person person)
{
System.out.println(person);
return personRepo.FindPerson(person);
}
в @RequestBody Person person содержится JSON: "{"id":0,"f":"Иванов","i":"Иван","o":""}"
так вот у меня валится бекенд с 500 ошибкой, не доходит даже до System.out.println(person);
я думаю что бекенд не может входящий json превратить в Person.
Причем не работает в итоговом jar файле, а в режиме dev все нормально.
в чем может быть причина?
Допустим у нас есть связанные двунаправленно сущности, образующие иерархию из нескольких таблиц. Как сделать так, чтобы каждый контроллер посылал только свой конкретный набор связей из этой полной иерархии?
стотысячмиллионов лайков!
спасибо!!!!!
Spring boot 2.0.5 все работает и запускается без зависимостей javax.xml.bind:jaxb-api, com.sun.xml.bind:jaxb-core, com.sun.xml.bind:jaxb-impl.
Я использую springBootVersion = '2.0.5.RELEASE' и подключаю только compile('javax.xml.bind:jaxb-api') и spring запускается без ошибок.
Если добавлять библиотеки compile('com.sun.xml.bind:jaxb-core') и compile('com.sun.xml.bind:jaxb-impl') то при сборке gradle выдает следующую ошибку Error:java: Illegal char at index 50: C:\project\service\Could not find com.sun.xml.bind:jaxb-core:.
всё верно, где-то я вроде упоминал, что эти зависимости были костылями. Значит, починили эту проблему
По состоянию на 07.02.2022 г., чтобы весь код работал зависимости должны быть такими:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.postgresql:postgresql'
implementation 'org.projectlombok:lombok'
implementation 'javax.xml.bind:jaxb-api'
}
@@user-gj3rz7qv1l Спасибо тебе огромное !!! Помогло
в 2020 для внедрения репозитория в контроллер достаточно поставить аннотацию над контроллером @RequiredArgsConstructor и указать private final MessageRepo messageRepo;
и добавить в build.gradle в блок dependencies: annotationProcessor 'org.projectlombok:lombok:1.18.12'
Хз, если честно, в чем у меня проблема, но vue не отображает данные из бд на главной, хотя в самой базе данные есть, неоднократно проверял, и сам код из гитхаба копировал.
Cannot convert value of type 'java.lang.String' to required type 'letscode.sarfan.domain.Message': no matching editors or conversion strategy found
смени версию спринга на 2.3.0
plugins {
id 'org.springframework.boot' version '2.3.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'letscode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web:2.3.0.RELEASE'
compile 'org.springframework.boot:spring-boot-devtools:2.3.0.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-data-jpa:2.3.0.RELEASE'
compile 'mysql:mysql-connector-java:8.0.21'
compile 'org.projectlombok:lombok'
compile 'javax.xml.bind:jaxb-api:2.3.0'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
@@user-cr2dd3wk5m получается, в 2.3.1. такая магия уже не срабатывает? У себя сделал вытаскивание из репозитория по айдишнику - и взлетело.
thx
Крутые видео. Спасибо. Все понятно и есть где применить.
У меня один вопрос. Не по теме. Если автор ответ. Огромное спасибо.
У меня в приложении есть потребность реализовать json-rpc. Можно ли внедрить в решения рассматриваемые на ваших занятиях json-rpc? И на сколько это целесообразно ?
Я имею ввиду, что разрабатываю решение задач а базе Ваших уроков. Но босы хотят json-rpc. Вот хочу понять насколько это целесообразно ?
Можно все. А нужно ли и оправдано ли - надо смотреть по месту и по задачам
А не подскажете куда копать по этому вопросу. С помощью каких средства спринга можно реализовать json-rpc 2.0?
Чтобы удалить сущность из базы нет необходимости формировать объект, в стандартном репозитории есть метод *deleteById* . Предлагаю в контроллере метод delete переписать так:
@DeleteMapping("{id}")
public void delete(@PathVariable long id) {
messageRepo.deleteById(id);
}
Спасибо за почти готовую курсовую xD
Привет из декабря 2020 :)
Всех с наступающим!
Просматривая комментарии, заметил вопросы про БД. Сам тоже столкнулся и решил проблему свою. Кто желает подключаться через MySQL, то читайте...
Я создал БД в консоли - CREATE DATABASE db_name; USE db_name;
db_name - тут вы пишите свое название БД
Затем в файле application.properites пишем...
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_name?useUnicode=true&serverTimezone=UTC&useSSL=false//
После имени БД строчка кода, чтобы компилятор не ругался
spring.datasource.username=root
//У вас может быть свое имя
spring.datasource.password= //У вас может быть свой пароль (У меня его нет)
spring.jpa.generate-ddl=true
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
В файле bulid.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// implementation 'org.postgresql:postgresql'
runtimeOnly 'mysql:mysql-connector-java'
// Для MySQL
implementation 'org.projectlombok:lombok'
implementation 'javax.xml.bind:jaxb-api'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
Что бы не пытался сделать выбивает "Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured."
я как человек с опытом(с твоих курсов), почему не учишь сразу правильно писать: Service inteface -> Impl , вместо напрямую через Repository в контроллере использовать?)
а это правильно? Я не знаю, опыта мало, но когда нативные методы из коробки используются - ведь нам даже сигнатуры пока не нужно было писать в репозитории, - есть смысл их через сервис гнать?
у меня не получается подключиться к базе данных. Ошибка: org.postgresql.util.PSQLException: Подсоединение по адресу localhost:5432 отклонено. Проверьте что хост и порт указаны правильно и что postmaster принимает TCP/IP-подсоединения.
А бд установлена-запущена?
установлена, но не получилось запустить, с MySQL тоже самое, хотя раньше с свитером нормально работало. Проблему удалось решить использованием бд h2
spring.jackson.serialization.indent-output=true
Не поможет ?
насколько гуд-практис явл. реализация интрфейса Serializable в классах сущностей?
Норм. Если это действительно надо. "прозапас" писать не надо
оставляйте версию спринга как на видео, я делал на 2.3.1 - в итоге ничего не работало)
org.postgresql.util.PSQLException: ОШИБКА: отношение "hibernate_sequence" не существует
Позиция: 17
Не коннектится созданная база PostgreSQL при создании базы. Ошибка:
Connection to sarafan@localhost failed.
[08001] Подсоединение по адресу localhost:5432 отклонено. Проверьте что хост и порт указаны правильно и что postmaster принимает TCP/IP-подсоединения.
Подскажите, пожалуйста, как можно это победить?
Бд установлена?
создайте базу из консоли
создайте в базе юзера с паролем
@Getter @Setter @Builder это если про Lombok, что вы искали, если еще нужно)
@Data и так содержит в себе геттеры/сеттеры
Простите, я не понимаю, как это работает. А именно - мы просто указываем маппинг обработанный в контроллерею , как ресурс, и Vue компоненты подхватывают и нашу базу, и методы, которые даже называются по разному во Vue и в контроллере. Ну ладно , messages подхватываются, но методы? Мы ведь даже не указываем get, post, put, delete. И конечно, я не смог на лету все это адаптировать к Vue3, использую пока Vue 2. Потом буду думать как мигрировать. Пока не нашел нормального описания именно варианта с CDN во Vue3, большая часть материала касается приложений, у которых и серверная и клиентская часть на Vue. Если кто полезные ссылки даст - буду рад. Мне нравится этот вариант, так как для демонстрации два сервера городить не вижу смысла, а тут , как я понимаю, все работает на одном сервере - и фронт и бэк.
На словах ".. я могу предложить оттакую запись .." плашки закрывают всё))
ссыль на код битая
Исправил, спасибо)
хм забавно, почему то у меня стал запускаться Debug режим за минуты 4, а обычный запуск приложения занимает 8 сек. Но дебаг блин более 2-4 минут, как так то?
произошло это не знаю даже после чего .
Кто то сталкивался?
А если точнее запуски дебага идет за
Started TestApplication in 291.606 seconds (JVM running for 292.909)
А обычный
Started TestApplication in 7.271 seconds (JVM running for 8.299)
Откатился на предыдущий урок, запускаться стал за 4 сек дебаг.
Сейчас буду искать причину
Нашел, при наследовании extends JpaRepository оочень долго начинает думать. Почему с чем это может быть связано? почему только в дебаг режиме
Пом файл
org.springframework.boot
spring-boot-starter-data-jpa
2.1.0.RELEASE
org.postgresql
postgresql
42.2.5
org.projectlombok
lombok
1.18.4
provided
Бред какой то
начал юзать более старые версии JPA все тоже самое
Забавно
Установил intellij IDEA Ultimate, Debug mode начал запускаться за 12 сек
возможно ты дебажил метод, что тормозит запуск дебаг мода
Привет. Всем у кого проблемка типа "java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.", решение здЭсь: stackoverflow.com/questions/26515700/mysql-jdbc-driver-5-1-33-time-zone-issue
2021: implementation 'com.sun.xml.bind:jaxb-core:3.0.2'
implementation 'com.sun.xml.bind:jaxb-impl:3.0.2'
Спасибо! Отличный и лаконичный материал!