Статьи

Spring Rest Controller с ресурсом angularjs

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.