Angularjs ngResource — это модуль angularjs для взаимодействия со службами на основе REST. Я недавно использовал его для небольшого проекта со Spring MVC и хотел задокументировать конфигурацию, которая хорошо работала для меня.
Контроллер работает на заводе, он поддерживает операции CRUD на объекте Hotel и поддерживает следующие методы:
- POST / rest / hotels — создает гостиницу
- GET / отдых / отели — получает список объектов отеля
- GET / rest / hotels /: id — получает объект с указанным Id
- PUT / отдых / отели /: id — обновляет сущность
- DELETE / rest / hotels /: id — удаляет объект с указанным идентификатором
Это может быть реализовано следующим образом с помощью Spring MVC:
|
01
02
03
04
05
06
07
08
09
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
|
@RestController@RequestMapping("/rest/hotels")public class RestHotelController { private HotelRepository hotelRepository; @Autowired public RestHotelController(HotelRepository hotelRepository) { this.hotelRepository = hotelRepository; } @RequestMapping(method=RequestMethod.POST) public Hotel create(@RequestBody @Valid Hotel hotel) { return this.hotelRepository.save(hotel); } @RequestMapping(method=RequestMethod.GET) public List<Hotel> list() { return this.hotelRepository.findAll(); } @RequestMapping(value="/{id}", method=RequestMethod.GET) public Hotel get(@PathVariable("id") long id) { return this.hotelRepository.findOne(id); } @RequestMapping(value="/{id}", method=RequestMethod.PUT) public Hotel update(@PathVariable("id") long id, @RequestBody @Valid Hotel hotel) { return hotelRepository.save(hotel); } @RequestMapping(value="/{id}", method=RequestMethod.DELETE) public ResponseEntity<Boolean> delete(@PathVariable("id") long id) { this.hotelRepository.delete(id); return new ResponseEntity<Boolean>(Boolean.TRUE, HttpStatus.OK); }} |
Обратите внимание на аннотацию @RestController, это новая аннотация, представленная в Spring Framework 4.0, с этой аннотацией, указанной на контроллере, аннотации @ResponseBody для каждого из методов можно избежать.
На стороне angularjs модуль ngResource может быть настроен на заводе следующим образом, чтобы использовать этот сервис:
|
1
2
3
4
5
6
7
|
app.factory("Hotel", function ($resource) { return $resource("/rest/hotels", {id: "@id"}, { update: { method: 'PUT' } });}); |
Единственное изменение конфигурации по умолчанию заключается в указании дополнительного действия «обновление» с помощью метода HTPP вместо POST. С этим изменением к REST API можно получить доступ следующим образом:
POST / отдых / отели переводится как:
|
1
2
|
var hotel = new Hotel({name:"test",address:"test address", zip:"0001"});hotel.$save(); |
Или другой вариант этого:
|
1
|
Hotel.save({}, {name:"test",address:"test address", zip:"0001"}); |
GET / отдых / отели переводится как:
|
1
|
Hotel.query(); |
GET / rest / hotels /: id переводится как:
|
1
|
Hotel.get({id:1}) |
PUT / отдых / отели /: id переводится как:
|
1
2
|
var hotel = new Hotel({id:1, name:"test",address:"test address", zip:"0001"});hotel.$update(); |
DELETE / rest / hotels /: id переводится как:
|
1
2
|
var hotel = new Hotel({id:1});hotel.$delete(); |
ИЛИ ЖЕ
|
1
|
Hotel.delete({id:1}); |
Для обработки успешных и неудачных результатов просто передайте дополнительные обработчики обратного вызова:
например, с созданием:
|
1
2
3
4
5
6
|
var hotel = new Hotel({name:"test",address:"test address", zip:"0001"});hotel.$save({},function(response){ //on success}, function(failedResponse){ //on failure}); |
- Полный рабочий образец CRUD с angularjs и Spring MVC доступен по адресу github : https://github.com/bijukunjummen/spring-boot-mvc-test/tree/withangular
| Ссылка: | Spring Rest Controller с ресурсом angularjs от нашего партнера по JCG Бижу Кунджуммен в блоге all and sundry. |