В качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте netology.ru.
Важно: ознакомьтесь со ссылками, представленными на главной странице репозитория с домашними заданиями.
Важно: если у вас что-то не получилось, то оформляйте Issue по установленным правилам.
- Создайте на вашем компьютере Maven-проект
- Инициализируйте в нём пустой Git-репозиторий
- Добавьте в него готовый файл .gitignore
- Добавьте в этот же каталог остальные необходимые файлы
- Сделайте необходимые коммиты
- Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым
- Сделайте пуш (удостоверьтесь, что ваш код появился на GitHub)
- Ссылку на ваш проект отправьте в личном кабинете на сайте netology.ru
Первая задача достаточно простая: вам нужно смигрировать ваше приложение на сервлетах, написанное в предыдущих ДЗ на Spring Web MVC с Embed Tomcat.
Создайте новый проект на базе Spring MVC и Embed Tomcat и перенесите реализованную в предыдущих ДЗ функциональность.
Ваш контроллер должен выглядеть именно так, как в лекции:
@RestController
@RequestMapping("/api/posts")
public class PostController {
private final PostService service;
public PostController(PostService service) {
this.service = service;
}
@GetMapping
public List<Post> 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.
Важно: данная задача не является обязательной
Самое плохое, что можно сделать с пользовательскими данными - это безвозвратно их удалить (они потом всегда звонят с просьбой восстановить и утверждают, что они-то точно ничего сами не удаляли). Поэтому чаще всего их не удаляют, а помечают на удаление (т.е. добавляют какое-то поле, например, removed
).
Для простоты мы будем считать, что /api/posts
- это API для клиентов, где они не смогут реализовать "восстановление" удалённых постов и даже просмотреть удалённые посты. Для этого будет отдельное API (позже).
Соответственно, получается, что removeById
всего лишь выставляет это поле. Но это не всё, работа остальных методов тоже кардинально меняется:
all
возвращает все посты, кроме тех, у которых выставлен флагremoved
getById
возвращает пост только если у него не выставлен флагremoved
, в противном случае кидаетNotFoundException
*save
обновляет существующий пост только если у него не выставлен флагremoved
, в противном случае кидаетNotFoundException
*
Примечание*: здесь нет идеального решения, разные люди могут вам говорить, что так можно, так нельзя и т.д. Мы же лишь скажем, что любая категоричность - это всегда плохо и вы должны понимать, что бывает по-разному, всё зависит от того, какое решение примет проектировщик API или команда.
Единственный вопрос остаётся со статус кодами. По логике, NotFoundException
должен приводить к статус коду 404. Изучите документацию на @ResponseStatus и подумайте, как её применить для выставления статуса кода 404 при возникновении указанного нами Exception'а.
Подсказка
Использовать её нужно в формате @ResponseStatus(code = HttpStatus.NOT_FOUND)
, при этом, конечно же, импортировать и ResponseStatus
и HttpStatus
.
Создайте Pull Request с описанной функциональностью к проекту из первой задачи (Migration).
Решение по тому, на каком именно слое реализовать данную логику - остаётся за вами. Скажем лишь, что это точно не Controller.
Обратите внимание, что вся функциональность (CRUD), реализованная до этого, должна по-прежнему работать.
В качестве результата пришлите:
- Ссылку на ваш Pull Request в личном кабинете студента на сайте netology.ru
- Обоснование, почему вы реализовали логику именно в том слое, в котором реализовали