KEMBAR78
Consume Spring Data Rest with Angularjs | ODP
Consume Spring Data Rest
using AngularJS
Corneil du Plessis
corneil.duplessis@gmail.com
corneil@jumpco.io
@corneil
about.me/corneil
Introduction
What is Spring Data Rest
โ— Spring Data Repositories
โ— REST
Representational State Transfer
โ— HATEOAS
Hypermedia as Engine of Application State
Steps
โ— Spring Boot Application
โ€“ http://start.spring.io
โ€“ Entities
โ€“ Repositories
โ— Web Application
โ€“ Angular Service
โ€“ Angular Controller
โ€“ Web Page
Component Model
Spring Initializr
Entities
โ— JPA @Entity
โ— MongoDB @Document
@Entity
public class User {
@Id @GeneratedValue
private Long id;
@NotNull @Column(unique = true)
private String userId;
@Temporal(TemporalType.DATE)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private Date dateOfBirth;
@Email @NotNull
private String emailAddress;
@NotNull
private String fullName;
}
Repositories
public interface UserRepository extends CrudRepository<User, Long> {
User findOneByUserId(
@Param("userId") String userId);
List<User> findByUserIdContainsIgnoreCase(
@Param("input") String input);
}
Create Data
โ— SoapUI
โ— HAL Browser
Customizing Resources
โ— @RestResource
โ— @RepositoryRestResource
โ— Extend ResourceProcessor
โ— EntityLinks
โ— Projections
Custom Repository Behaviour
โ— Finder Methods
โ— Extend AbstractRepositoryEventListener
โ€“ onBefore and onAfter
โ€“ for Delete/Save/Create/Link
Angular Service
โ— $q Asyncronous service with deferred and promises
โ— $resourceProvider
โ— Module ngResource
โ— $resource service
โ— $cacheFactory
Angular Service
angular.module('springDataRestDemo')
.service('UserService',
['$q', '$resource', '$log', 'userCache', '$http',
function ($q, $resource, $log, userCache, $http) {
var Users = $resource('/rest/users', {}, {
create: {method: 'POST'},
list: {method: 'GET'}
});
return {
loadAllUsers: function () {
var deferred = $q.defer();
Users.list().$promise.then(
function (users) {
deferred.resolve(users._embedded.users);
},
function (response) {
deferred.reject(response);
});
return deferred.promise;
}
}
Angular Service
createUser: function (user) {
var deferred = $q.defer();
Users.create(user).$promise.then(
function (user) {
deferred.resolve(user);
},
function (response) {
deferred.reject(response);
});
return deferred.promise;
}
Angular Service
saveUser: function (user) {
var deferred = $q.defer();
var User = $resource(user._links.self.href, {}, {save: {method: 'PUT'}});
User.save(user).$promise.then(
function (data) {
deferred.resolve(data);
},
function (response) {
deferred.reject(response);
});
return deferred.promise;
}
Angular Controller
$scope.users = null;
$scope.promise = UserService.loadAllUsers();
$scope.promise.then(function (users) {
for (var i in users) {
users[i].selected = false;
}
$scope.users = users;
}, function (response) {
alert('Load error: ' + response.statusText);
});
Angular Controller
$scope.save = function () {
$scope.errorMessages = [];
$scope.user.dateOfBirth = moment($scope.dateOfBirth).format('YYYY-MM-DD');
var promise = $scope.newUser ? UserService.createUser($scope.user)
: UserService.saveUser($scope.user);
promise.then(
function (user) {
$mdDialog.hide(user);
NotificationService.toastMessage($scope.newUser ? 'User Created'
: 'User Saved');
},
function (response) {
if (response.status == 409 && response.statusText == 'Conflict') {
$scope.userForm.userId.$setValidity('unique', false);
} else {
var errorData = response.data;
$scope.errorMessages.push(errorData.message);
}
});
}
Web Page
<table ng-controller="UserController">
<thead>
<tr>
<th>User Id</th>
<th>Name</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in users">
<td ng-bind="user.userId"></td>
<td ng-bind="user.fullName"></td>
<td>
<button ng-click="editUser($event, user)" value="Edit"></button>
<button ng-click="deleteUser($event, user)" value="Delete"></button>
</td>
</tr>
</tbody>
</table>
Security
โ— Spring Data Rest
โ€“ @RepositoryRestResource(
exported = false)
โ€“ @RestResource(exported = false)
โ— Spring Security
โ€“ HttpSecurity
โ€“ @PreAuthorize(โ€œhasRole('UserAdmin')โ€)
โ— Spring Data
โ€“ @Query(โ€œselect u from User u where u.name
== ?#{principal.name}โ€)
Questions
โ— Code - https://github.com/corneil/spring-data-rest-angular-demo
โ— Slides - http://www.slideshare.net/CorneilduPlessis
โ— Profile https://about.me/corneil
โ— Twitter @corneil

Consume Spring Data Rest with Angularjs

  • 1.
    Consume Spring DataRest using AngularJS Corneil du Plessis corneil.duplessis@gmail.com corneil@jumpco.io @corneil about.me/corneil
  • 2.
  • 3.
    What is SpringData Rest โ— Spring Data Repositories โ— REST Representational State Transfer โ— HATEOAS Hypermedia as Engine of Application State
  • 4.
    Steps โ— Spring BootApplication โ€“ http://start.spring.io โ€“ Entities โ€“ Repositories โ— Web Application โ€“ Angular Service โ€“ Angular Controller โ€“ Web Page
  • 5.
  • 6.
  • 7.
    Entities โ— JPA @Entity โ—MongoDB @Document @Entity public class User { @Id @GeneratedValue private Long id; @NotNull @Column(unique = true) private String userId; @Temporal(TemporalType.DATE) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private Date dateOfBirth; @Email @NotNull private String emailAddress; @NotNull private String fullName; }
  • 8.
    Repositories public interface UserRepositoryextends CrudRepository<User, Long> { User findOneByUserId( @Param("userId") String userId); List<User> findByUserIdContainsIgnoreCase( @Param("input") String input); }
  • 9.
  • 10.
    Customizing Resources โ— @RestResource โ—@RepositoryRestResource โ— Extend ResourceProcessor โ— EntityLinks โ— Projections
  • 11.
    Custom Repository Behaviour โ—Finder Methods โ— Extend AbstractRepositoryEventListener โ€“ onBefore and onAfter โ€“ for Delete/Save/Create/Link
  • 12.
    Angular Service โ— $qAsyncronous service with deferred and promises โ— $resourceProvider โ— Module ngResource โ— $resource service โ— $cacheFactory
  • 13.
    Angular Service angular.module('springDataRestDemo') .service('UserService', ['$q', '$resource','$log', 'userCache', '$http', function ($q, $resource, $log, userCache, $http) { var Users = $resource('/rest/users', {}, { create: {method: 'POST'}, list: {method: 'GET'} }); return { loadAllUsers: function () { var deferred = $q.defer(); Users.list().$promise.then( function (users) { deferred.resolve(users._embedded.users); }, function (response) { deferred.reject(response); }); return deferred.promise; } }
  • 14.
    Angular Service createUser: function(user) { var deferred = $q.defer(); Users.create(user).$promise.then( function (user) { deferred.resolve(user); }, function (response) { deferred.reject(response); }); return deferred.promise; }
  • 15.
    Angular Service saveUser: function(user) { var deferred = $q.defer(); var User = $resource(user._links.self.href, {}, {save: {method: 'PUT'}}); User.save(user).$promise.then( function (data) { deferred.resolve(data); }, function (response) { deferred.reject(response); }); return deferred.promise; }
  • 16.
    Angular Controller $scope.users =null; $scope.promise = UserService.loadAllUsers(); $scope.promise.then(function (users) { for (var i in users) { users[i].selected = false; } $scope.users = users; }, function (response) { alert('Load error: ' + response.statusText); });
  • 17.
    Angular Controller $scope.save =function () { $scope.errorMessages = []; $scope.user.dateOfBirth = moment($scope.dateOfBirth).format('YYYY-MM-DD'); var promise = $scope.newUser ? UserService.createUser($scope.user) : UserService.saveUser($scope.user); promise.then( function (user) { $mdDialog.hide(user); NotificationService.toastMessage($scope.newUser ? 'User Created' : 'User Saved'); }, function (response) { if (response.status == 409 && response.statusText == 'Conflict') { $scope.userForm.userId.$setValidity('unique', false); } else { var errorData = response.data; $scope.errorMessages.push(errorData.message); } }); }
  • 18.
    Web Page <table ng-controller="UserController"> <thead> <tr> <th>UserId</th> <th>Name</th> <th>Action</th> </tr> </thead> <tbody> <tr ng-repeat="user in users"> <td ng-bind="user.userId"></td> <td ng-bind="user.fullName"></td> <td> <button ng-click="editUser($event, user)" value="Edit"></button> <button ng-click="deleteUser($event, user)" value="Delete"></button> </td> </tr> </tbody> </table>
  • 19.
    Security โ— Spring DataRest โ€“ @RepositoryRestResource( exported = false) โ€“ @RestResource(exported = false) โ— Spring Security โ€“ HttpSecurity โ€“ @PreAuthorize(โ€œhasRole('UserAdmin')โ€) โ— Spring Data โ€“ @Query(โ€œselect u from User u where u.name == ?#{principal.name}โ€)
  • 20.
    Questions โ— Code -https://github.com/corneil/spring-data-rest-angular-demo โ— Slides - http://www.slideshare.net/CorneilduPlessis โ— Profile https://about.me/corneil โ— Twitter @corneil