Форум программистов, компьютерный форум, киберфорум
REST API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 79

Spring Boot REST сервис

08.11.2016, 13:57. Показов 3678. Ответов 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
16.12.2017, 11:42
Студворк — интернет-сервис помощи студентам
arts1, вопрос то в чем? Вы устроили флуд в чужой теме, пишите тут какие-то посты в повествовательном ключе....что надо то? Какой вопрос?
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
17.12.2017, 06:43
Ну хорошо - простой вопрос. mysql запущена как служба - были проблемы с запуском севрера
потому были предыдущие эксепшены сервера.
Захожу в папку бин - C:\mysql\bin
Ввожу - mysql -u root -p
Кликаю энтер - пустой пароль.
Создаю бд - CREATE DATABASE market --переход на другую строку
USE market - тоже самое
SHOW DATABASES - аналогично.
ЗАхожу еще раз в командную строку -
USE market - теперь сообщение что Unknown database market.
Если еще раз по новой захожу - и ввожу пароль root -
после mysql -u root -p -
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YeS) - непонятно
есть пароль или нет.
Если не ввожу то ошибки нету - только вот такое --
mysql>
->
->
Что это может значит. Как же создать и использовать самую простую бд.
В папке data ее нет - может не инициализирована эта папка, хотя логи с ошибками регулярно появляются.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
17.12.2017, 07:41
arts1, Jdbc соединение создается к конкретной бд, т.е. на момент запуска она должна существовать, можно извратиться и предварительно подключаться к бд по умолчанию и создавать нужную, но есть одно но, бд обычно создается пользователем с повышенными привилегиями, а на созданную бд даются права конкретному пользователю, возможно даже новому, вот учеткой именно этого пользователя владеет приложение. Это пользователь скорее всего правами создания бд владеть не будет.

На счет консольных команд, это обычные sql запросы, т.е. должны заканчиваться точкой с запятой
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
17.12.2017, 15:09
Ну после того как я создал бд в воккбенчах -
то сервер запустился без ексепшенов. Однако
посылать запросы POST/GET із httprequste (postman for mozilla)
невозможно.
Ввожу в запрос для нового юзера- POST возвращает статус 0.
Хочу получить хотя бы одного созданного в вокбенче вручную юзера через
get тоже статус 0.
Если из командной строки мозиллы - непонятный тескт - native password ..order out of sequence.
Если дело в каком то пароле то он должен быть пуст, и сервер с помощью моего root-а
создал таблицы, а я в вокбенчах добавил данные в таблицу??
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
18.12.2017, 05:55
У тебя либо не поднялось приложение, либо не на тот порт стучишься
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
27.12.2017, 01:47
Ну я так думаю что приложение поднялось, порт свободный (8080).
Дело наверное в коде сервера, или то что я использую плагин веб-браузера.
Вот обращался с реквест параметрами на URI localhost:8080/register и localhost:8080/login.
Сперва в двух случаях - был респонс - 403 forbidden message - догадался с информации
в интернетн, что надо отменить cfrs - в configure(Httpsecurity http) { http.cfrs().disable();}
Действительно ошибка 403 исчезла.
Но создать новый акаунт не удается - получаю уже 404 - not found. Может здесь какая то механическая ошибка.
Пробую логинится через созданные вручную акаунты в бд (email и password).
Получаю в ответ как респонс html-form:
<html><head><title>Login Page</title></head><body onload='document.f.email.focus();'>
<p style='color:red;'>Your login attempt was not successful, try again.<br/><br/>Reason: User is disabled</p><h3>Login with Username and Password</h3><form name='f' action='/login' method='POST'>
....
То есть дальше в форме разметка для ввода емейла и пароля нового, но запрос сейчас из
плагина, но на практике мне надо java-fx.
И такое сообщение о user disabled - в независимости от пароля. его правильнсоти, или присутсвия вообще.
Если я введу неправильный эмейл - то причина уже другая -
Reason: Bad Credentials. То есть сервер все таки как то взаимодействует с запросом.
Прочитал в интернете что user в userDetails по умолчанию disabled - как его сделать enabled,
если в userDetails interface только метод проверки isEnabled()?

Добавлено через 11 часов 24 минуты
Действительно при обращение к localhost:8080/register - ошибка в URI.
Акаунт юзера можно создать но пароль там зашифрован, в отличиние если вводить его вручную
или через INSERT INTO.
Теперь уже обращаюсь к localhost:8080/login с емейлом и паролем (зашифрованном в бд).
Однако в отличие от предыдущего варианта - получаю
{... status":404,"error":"Not Found","message":"No message available","path":"/"}
И path - "/" - хотя в самом запросе, в окне плагина, path отображается как "/login".
То есть при обращение в логину созданному вручную логин получает свой URI,
а при обращению к логину созданному напрямую идет какое то перенаправление что-ли на "/"?

Здесь у меня один непонятный теоретический вопрос к Spring Security:
если применяется cookies - каким образом (методом) этот cookies генерируется при первом обращение от клиента (достаточно ли просто указать в Request response header - Set cookie, и происходит автоматичекая генерация)
, и как проверяется этот cookies при повторных обращениях с помощью запросов с клиента на спринг сервер?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.12.2017, 09:42
arts1, читайте про JWT. Вам для JavaFX клиента ненужны никакие кукиз...
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
27.12.2017, 12:35
Сервер то не я писал - так что надо менять код на сервере.
И вижу, что сам спринг секюрити (код сервера) никак не обрабатывает кукиз.
Мне предоставили запросы с кукиз со стороны клиента, но в их роботоспособности есть большие сомнения.
0
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru