https://github.com/skyrocketstan/learning_netology_java_spring_web_mvc
Домашнее задание к занятию «2.3. Spring Web MVC»
https://github.com/skyrocketstan/learning_netology_java_spring_web_mvc
java javalearning netology spring spring-mvc
Last synced: about 1 month ago
JSON representation
Домашнее задание к занятию «2.3. Spring Web MVC»
- Host: GitHub
- URL: https://github.com/skyrocketstan/learning_netology_java_spring_web_mvc
- Owner: SkyrocketStan
- Created: 2022-10-23T09:30:54.000Z (over 3 years ago)
- Default Branch: master
- Last Pushed: 2025-02-10T10:48:27.000Z (over 1 year ago)
- Last Synced: 2025-02-10T11:35:04.661Z (over 1 year ago)
- Topics: java, javalearning, netology, spring, spring-mvc
- Language: Java
- Homepage:
- Size: 22.5 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Домашнее задание к занятию «2.3. Spring Web MVC»
В качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте [netology.ru](https://netology.ru).
**Важно**: ознакомьтесь со ссылками, представленными на главной странице [репозитория с домашними заданиями](../README.md).
**Важно**: если у вас что-то не получилось, то оформляйте Issue [по установленным правилам](../report-requirements.md).
## Как сдавать задачи
1. Создайте на вашем компьютере Maven-проект
1. Инициализируйте в нём пустой Git-репозиторий
1. Добавьте в него готовый файл [.gitignore](../.gitignore)
1. Добавьте в этот же каталог остальные необходимые файлы
1. Сделайте необходимые коммиты
1. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым
1. Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub)
1. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](https://netology.ru)
## Migration
### Легенда
Первая задача достаточно простая: вам нужно смигрировать ваше приложение на сервлетах, написанное в предыдущих ДЗ на Spring Web MVC с Embed Tomcat.
### Задача
Создайте новый проект на базе Spring MVC и Embed Tomcat и перенесите реализованную в предыдущих ДЗ функциональность.
Ваш контроллер должен выглядеть именно так, как в лекции:
```java
@RestController
@RequestMapping("/api/posts")
public class PostController {
private final PostService service;
public PostController(PostService service) {
this.service = service;
}
@GetMapping
public List all() {
return service.all();
}
@GetMapping("/{id}")
public Post getById(@PathVariable long id) {
return service.getById(id);
}
@PostMapping
public Post save(@RequestBody Post post) {
return service.save(post);
}
@DeleteMapping("/{id}")
public void removeById(long id) {
service.removeById(id);
}
}
```
Обратите внимание, что вся функциональность (CRUD), реализованная до этого, должна по-прежнему работать.
### Результат
В качестве результата пришлите ссылку на ваш GitHub проект в личном кабинете студента на сайте [netology.ru](https://netology.ru).
## Данные не удаляются*
**Важно**: данная задача не является обязательной
### Легенда
Самое плохое, что можно сделать с пользовательскими данными - это безвозвратно их удалить (они потом всегда звонят с просьбой восстановить и утверждают, что они-то точно ничего сами не удаляли). Поэтому чаще всего их не удаляют, а помечают на удаление (т.е. добавляют какое-то поле, например, `removed`).
Для простоты мы будем считать, что `/api/posts` - это API для клиентов, где они не смогут реализовать "восстановление" удалённых постов и даже просмотреть удалённые посты. Для этого будет отдельное API (позже).
Соответственно, получается, что `removeById` всего лишь выставляет это поле. Но это не всё, работа остальных методов тоже кардинально меняется:
* `all` возвращает все посты, кроме тех, у которых выставлен флаг `removed`
* `getById` возвращает пост только если у него не выставлен флаг `removed`, в противном случае кидает `NotFoundException`*
* `save` обновляет существующий пост только если у него не выставлен флаг `removed`, в противном случае кидает `NotFoundException`*
Примечание*: здесь нет идеального решения, разные люди могут вам говорить, что так можно, так нельзя и т.д. Мы же лишь скажем, что любая категоричность - это всегда плохо и вы должны понимать, что бывает по-разному, всё зависит от того, какое решение примет проектировщик API или команда.
Единственный вопрос остаётся со статус кодами. По логике, `NotFoundException` должен приводить к статус коду 404. Изучите документацию на [@ResponseStatus](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseStatus.html) и подумайте, как её применить для выставления статуса кода 404 при возникновении указанного нами Exception'а.
Подсказка
Использовать её нужно в формате `@ResponseStatus(code = HttpStatus.NOT_FOUND)`, при этом, конечно же, импортировать и `ResponseStatus` и `HttpStatus`.
### Задача
Создайте Pull Request с описанной функциональностью к проекту из первой задачи (Migration).
Решение по тому, на каком именно слое реализовать данную логику - остаётся за вами. Скажем лишь, что это точно не Controller.
Обратите внимание, что вся функциональность (CRUD), реализованная до этого, должна по-прежнему работать.
### Результат
В качестве результата пришлите:
1. Ссылку на ваш Pull Request в личном кабинете студента на сайте [netology.ru](https://netology.ru)
1. Обоснование, почему вы реализовали логику именно в том слое, в котором реализовали