0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 79

Spring Boot REST сервис

08.11.2016, 13:57. Показов 3182. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю в учебных целях REST сервис и постоянно возникают различные вопросы, каждый раз создавать тему не хочется по этому буду спрашивать все тут.
Имеется:
pom.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
Модель Message.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Entity
@Table(name = "message")
public class Message {
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;
    @Column(name = "MESSAGE")
    private String message;
    @Column(name = "AUTHOR")
    private String author;
    @Column(name = "CREATED")
    @Temporal(TemporalType.DATE)
    private Date created;
 
    public Message() {
    }
 
    public Message(Long id, String message, String author) {
        this.id = id;
        this.message = message;
        this.author = author;
        this.created = new Date();
    }
+ getters / setters
MessageRepository.java
Java
1
2
public interface MessageRepository extends JpaRepository<Message, Long>{
}
MessageController.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@RestController
public class MessageController {
 
    @Autowired
    private MessageRepository messageRepository;
 
    //Get all messages
    @RequestMapping(
            value = "/api/messages",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
     public List<Message> getAllMessages() {
        return messageRepository.findAll();
     }
 
    //Get one message for id
    @RequestMapping(
            value = "/api/message/{id}",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Message> getMessage(@PathVariable Long id) {
        return new ResponseEntity<>(messageRepository.findOne(id), HttpStatus.OK);
    }
 
    //Add one message
    @RequestMapping(
            value = "/api/message",
            method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> addMessage(@RequestBody Message newMessage) {
        //newMessage.setCreated(new Date());
        return new ResponseEntity<>(messageRepository.save(newMessage), HttpStatus.CREATED);
    }
 
    //Add array of messages
    @RequestMapping(
            value = "api/messages",
            method = RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> addMessages(@RequestBody List<Message> newMessages) {
 
        return new ResponseEntity<Object>(messageRepository.save(newMessages), HttpStatus.CREATED);
    }
}
Получение всех данных из БД работает.
Получение одной записи по id из БД работает.
Добавление одной записи в БД работает но не присваивается дата, так же и при добавлении массива данных. Если в методе addMessage раскомментировать строку newMessage.setCreated(new Date()); то дата добавляется.
Я так понимаю что конструктор в модели Message должен добавлять дату автоматически, но если это не происходит, значит он не используется. Попытался с помощью дебагера отследить, не получилось.
1. Хочется понять механику работы Контроллер-Конструктор?
2. Нужно ли для этих целей использовать Service и вообще когда нужно?
В интернете куча примеров но все по принципу "как короче, в жизни делается по другому".
3. Ну и вопрос с датой решить.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2016, 13:57
Ответы с готовыми решениями:

Относительный адрес REST Spring Boot
Здравствуйте! Подскажите, пожалуйста, как можно сделать так, чтобы мне не нужно было в конфигурацию микросервисов добавлять url сервера...

Spring MVC, Spring REST
Всем привет! Изучаю фреймворк Spring и возникло несколько вопросов в процессе, на которые не уверен однозначно, что до конца понимаю....

Что такое Spring, Spring Boot?
Здравствуйте. Никогда не использовал Spring, Spring Boot. Возник такой вопрос можно ли его использовать в IDE для java Se. Или для...

28
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.11.2016, 14:18
Цитата Сообщение от kuznets Посмотреть сообщение
каждый раз создавать тему не хочется по этому буду спрашивать все тут
как насчет почитать правила?

Для заполнения даты, используйте аннотацию @PrePersist

У вас вызывается дефолтный конструктор для вашего объекта поэтому дата не заполняется.


Желательно ввести слой сервиса и там проводить манипуляции с моделью.
Нежелательно отдавать и принимать от клиента объекты модели. Для этого нужно создавать DTO объекты и работать с ними.
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
14.12.2017, 15:51
У меня такой вопрос. Попытался я запустить spring boot server, с которым должно работать клиентское приложение что я разрабатываю. pom.xml сервера вложенный - даже до возможности нормального запуска не может дойти, ибо постоянно оновляются депенденси (выставлена опция в эклипсе - думаю грузяться только нужные зависимости) или оформляется воркспейс. Сперва было скачано 50, потом 100, и потом еще 200 мб, и постоянно происходит оновление. С чем это связано - проверял - приведенные депенденси и плагины мейвена весят не больше 500кб-1мб каждый, а их всего там -- 7-10. Еще есть приведенные репозитории и репозитории плагинов - может они хотят загрузится полностью на системник моего ПК, где места вообще минимум - как остановить эту уже фактически безперестанную загрузку - в настройках эклипса - или удалить репозитории из pom.xml?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
14.12.2017, 15:57
попробуй без эклипса запустить
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
14.12.2017, 16:27
Так в чем может причина такой загрузки. Может точно всеь репозиторий пробует скачать. Сколько там депенденси надо для спринг бута?
Не хочется использовать командную строку, надо указывать настройки конфигурации, версию джава 8, вместо уже заложенной в реестр даже - версии 7.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
14.12.2017, 18:12
>_< джае вникать не хочу в то, что ты пишешь
mvn spring-boot:run -X -e
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
14.12.2017, 18:34
Хорошо.
Но разобраться надо почему мейвен качает и качает в локальный репозиторий.
У меня обозначена опция - download artifact sources. Может ее снять. Но когда я в начале пользование мейвеном (было это недавно) это не обозначал то были проблемы даже с созданием мейвен проэкта, и жаловался эклипс на артифакты.
Потом update index on startup - собственно что и осуществлялось, но и место на системном диске исчезало быстро.
Для разрешения этой проблеы предлагают вместо встроееного использовать локальный мейвен.
Еще есть отмеченная опция - do not automatically update from repository.
Особого представление нет без чего не может работать эклипс-мейвен, и как это отобразится после "снятие" этих опций в настройках эклипса.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
14.12.2017, 19:28
можно выполнить команду и почитать лог, например, вместо гаданий
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
14.12.2017, 20:09
Вот результат запуска команды: mvn spring-boot:run -X -e
1. В не-парент модуле - Caused by: org.apache.maven.project.DependencyResol utionException: Could not resolve dependencies for project <ИМЯ СЕВРЕРА>:jar:0.0.1-SNAPSHOT: Failure to find <ИМЯ СЕРВЕРА>.Common:jar:1.0-SNAPSHOT in https://repo.spring.io/snapshot was cached in the local repository, resolution will not be reattempted until the update interval of spring-snapshots has elapsed or updates are forced
2. В парент модуле (где есть парент pom.xml) - [ERROR] No plugin found for prefix 'spring-boot' in the current project and in t
he plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Documents and Settings\...\.m2\repository), central (http://repo.maven.apache.org/maven2)] ->org.apache.maven.plugin.prefix.NoPlugin FoundForPrefixException: No plugin found for prefix 'spring-boot' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C
:\Documents and Settings\...\.m2\repository), central (http://repo.maven.apache.org/maven2)]
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
14.12.2017, 22:13
1. Используй dependency management с bom от spring boot
2. Поставь Intellij Idea
3. Выкинь мавен и перейди на гредл
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
14.12.2017, 23:04
Я уже поодключал все опции апдейта при стартапе проэкта мейвен в Эклипсе, отключил загрузку артифактов но оно дальше апдейтится. Когда я каким то образом получил succes build парент модуля (вместе с тремя производными), получил потом succes build спринг сервера, но его запускал только ка Run as --> Maven опции. Но никакого сервера на localhost:8080 нету. Разве по новой импортить этот проэкт, и снова ждать эти бесконечные апдейты. Проблема в том что с самого начала модуль сервера был позначен красным - то биш ошибки но не известно какие. В то время когда два других модуля (один дополнительный, второй еще не заполненый) с самого начала поубавились "ошибок".
Интересно бы узнать какие опции мейвена в эклипсе использовать чтобы не допускать такого апдейта с самого начала?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
15.12.2017, 05:33
никак, eclipse, а вернее maven, тянет все необходимое для старта проекта, что с этим можно сделать я тебе ответил тут и в параллельной ветке, что не понятно?

Добавлено через 1 минуту
А на счет помеченного красным - man clean install и вывод в студию
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
15.12.2017, 07:22
Я поотменял все опции апдейта и загрузки артефактов. И получил вот такой список экспепшенов связанных с mysql-connector при запуске сервера-- мейвен билд проходит успешно.
ERROR 4088 --- [ main] com.zaxxer.hikari.pool.HikariPool : testdb - Exception during pool initialization.
com.mysql.jdbc.exceptions.jdbc4.Communic ationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Такие советы не помогают.

Добавлено через 14 минут
Выходит что при запуске mysql как сервиса - уже другой эксепшен - com.mysql.jdbc.exceptions.jdbc4.MySQLSyn taxErrorException: Unknown database '<NAME>',
хотя нейм это - имя таблицы а не БД?
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:
org.hibernate.service.spi.ServiceExcepti on: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEn vironment]
org.springframework.jdbc.support.MetaDat aAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcCo nnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyn taxErrorException: Unknown database '<NAME>'
Выходит вопросы уже к создателям JPA - структур.

Добавлено через 8 минут
В свойтсвах спринг бута uri - spring.datasource.url = jdbc:mysql://localhost:3306/NAME?useSSL=false
Почему имя создаваемой в режиме апдейта неизвестно, если служба mysql не вызывает прежних проюлем с конекшеном с бд.

Добавлено через 4 минуты
Посмотрел на примеры в интернете - не может ли эта строка быть разделена на две отдельных свойств -
spring.datasource.url = jdbc:mysql://localhost:3306/NAME?
useSSL=false
Хотя экспешн жалуется на имя бд.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
15.12.2017, 13:26
arts1, как у вас БД называется? NAME?
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
15.12.2017, 16:19
NAME это лиш плейсхолдер - имя конечно другое. Но не моя бд - потому использовал NAME.
Но разве само название на что-то влияет. Хотя как я уже указывал - имя этой еще не созданной на момент
запуска сервера бд совпадает с именем одной из нескольких таблиц этой бд.
Если Unknown database - может ее сперва надо создать, а потом использовать в режиме апдейт - spring.jpa.hibernate.ddl-auto = update

Добавлено через 1 минуту
А другие ексепшены из стека могут быть связаны с этой проюлемой или это уже другие причины?

Добавлено через 1 час 21 минуту
Вот собственно ответ на такой же вопрос:https://stackoverflow.com/ques... tabase-xyz
То есть надо создать эту бд - например - market.
Где ее создавать, в какой папке? - и надо ли мне создать только пустую бд, или все таблицы с полямы - например с помощью mysql workbench.

Добавлено через 15 минут
Действительно в коде есть анотации о таблицах? а не о бд. Если надо только вручную создать бд,
то как ее повязать с анотациями jpa, где размещать эту бд - в папке ресурсы спринг-бут сервера?
Еще такой момент что в проэкте нет файла конфигурации - persistence.xml.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
15.12.2017, 16:27
arts1, мало что понял из вашего комментария. БД нужно создавать руками. На момент запуска приложения, БД должна быть создана.

Цитата Сообщение от arts1 Посмотреть сообщение
Где ее создавать, в какой папке?
Ни в какой папке. Просто создайте БД в MySQL Workbench.

Таблицы можете сами создать или сгенерировать с помощью DDL
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
15.12.2017, 20:49
Как тогда спринг-бут "на ходу" найдет эту таблицу?
Таблицы можете сами создать или сгенерировать с помощью DDL -- так анотации JPA для чего?
Что то очень складно - если есть запрос эксепшена что нету такой бд,
то действительно в анотациях она не обозначена - но о таблицах есть информация.
Хотя не понятно почему не предусмотрено создание бд автоматически, если эта название предполагаемой бд обозначено в свойствах спринг-бута.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
16.12.2017, 01:18
Цитата Сообщение от arts1 Посмотреть сообщение
так анотации JPA для чего?
для маппинга таблицы на класс сущности

Цитата Сообщение от arts1 Посмотреть сообщение
если есть запрос эксепшена что нету такой бд,
это на каком языке щас было?

Цитата Сообщение от arts1 Посмотреть сообщение
Хотя не понятно почему не предусмотрено создание бд автоматически
можно создавать автоматически все что угодно. Можете почитать про Flyway или Liquibase, но лучше пока не стоит иначе совсем каша в голове будет.
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
16.12.2017, 03:56
Вот наглядное и простое пособие: https://spring.io/guides/gs/accessing-data-mysql/
Там и прямо указано, "что начинали из create, а потом можно переключится на update/none".
Я могу предположить, что через create режим, можно автоматически создать структуру бд,
и может быть и саму бд. А потом переключится в режим апдейта, который манипулирует структурой бд
в соответсвие с анотациями.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
16.12.2017, 10:55
arts1, ты какую то околесицу несёшь сразу в нескольких темах одновременно. Почему бы тебе не попробовать сделать все, чего ты пишешь, разобраться в терминах, в устройстве, например.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2017, 10:55
Помогаю со студенческими работами здесь

Spring в Spring Boot context
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( &quot;applicationContext.xml&quot; ); ...

Spring, REST, Json
Добрый день, Возникает следующая ошибка: HTTP Status 415 - description The server refused this request because the request...

Spring Rest авторизация
Здравтсвуйте! Хочу сделать доступ на rest сервис через токены. Логика такая: 1) Клиент идет по /auth, передавая логин и пароль....

Spring + hibenate, REST
Здравствуйте. Пишу учебный проект, spring + hibenate @Controller @RestController public class WebService { @Autowired ...

Boot rest service docs
Есть рест-сервис на буте, нужно генерировать доки (ендпоинт такой-то, на входе такие-то параметры, на выходе то-то, ошибки такие-то и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru