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. |