Angular 13 Spring WebFlux MongoDB CRUD Operations

In this tutorial, we’re gonna build a full Reactive Application in which, Spring WebFlux, Spring Data Reactive MongoDB are used for backend, and Angular, RxJS, EventSource are on client side.

Related Posts:
How to use Angular Http Client to fetch Data from SpringBoot RestAPI – Angular 13
How to use Angular HttpClient to POST, PUT, DELETE data on SpringBoot Rest APIs – Angular 13
How to build SpringBoot MongoDb RestfulApi
How to use SpringData MongoRepository to interact with MongoDB
Angular 13 + Spring Boot + MongoDB CRUD example
Introduction to RxJS – Extensions for JavaScript Reactive Streams

I. Technologies

– Java 1.8
– Maven 3.3.9
– Spring Tool Suite 3.9.0.RELEASE
– Spring Boot 2.0.0.RELEASE
– Angular 13
– RxJS 5.1.0
– MongoDB 3.4.10

II. Overview

1. Full Stack Architecture

angular-4-spring-webflux-reactive-mongodb-architecture

2. Reactive Spring Boot Server

2.1 Dependency

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2.2 Reactive Repository

We just need to create an interface that extends ReactiveCrudRepository to do CRUD operations for a specific type. This repository follows reactive paradigms and uses Project Reactor types (Flux, Mono) which are built on top of Reactive Streams.

import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;

public interface ReactiveCustomerRepository extends ReactiveCrudRepository<Customer, String> {

	Mono<Customer> findByLastname(String lastname);
	Flux<Customer> findByAge(int age);

	@Query("{ 'firstname': ?0, 'lastname': ?1}")
	Mono<Person> findByFirstnameAndLastname(String firstname, String lastname);
}

2.3 Activate reactive Spring Data MongoDB

Support for reactive Spring Data is activated through an @EnableReactiveMongoRepositories annotation:

import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;

import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;

@EnableReactiveMongoRepositories
public class MongoDbReactiveConfig extends AbstractReactiveMongoConfiguration {

	@Override
	public MongoClient reactiveMongoClient() {
		return MongoClients.create();
	}

	@Override
	protected String getDatabaseName() {
		return "jsa_mongodb";
	}
}

2.4 Call Reactive Repository

We can forward the reactive parameters provided by Spring Web Reactive, pipe them into the repository, get back a Flux/Mono and then work with result in reactive way.

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@CrossOrigin(origins = "http://localhost:4200")
@RestController
public class CustomerController {

	@Autowired
	ReactiveCustomerRepository customerRepository;

	@GetMapping("/customers")
	public Flux<Customer> getAllCustomers() {
		return customerRepository.findAll();
	}

	@PostMapping("/customers/create")
	public Mono<Customer> createCustomer(@Valid @RequestBody Customer customer) {
		return customerRepository.save(customer);
	}

	@PutMapping("/customers/{id}")
	public Mono<ResponseEntity<Customer>> updateCustomer(@PathVariable("id") String id, @RequestBody Customer customer) {
		return customerRepository.findById(id).flatMap(customerData -> {
			customerData.setName(customer.getName());
			customerData.setAge(customer.getAge());
			customerData.setActive(customer.isActive());
			return customerRepository.save(customerData);
		}).map(updatedcustomer -> new ResponseEntity<>(updatedcustomer, HttpStatus.OK))
				.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
	}

	@DeleteMapping("/customers/{id}")
	public ResponseEntity<String> deleteCustomer(@PathVariable("id") String id) {
		try {
			customerRepository.deleteById(id).subscribe();
		} catch (Exception e) {
			return new ResponseEntity<>("Fail to delete!", HttpStatus.EXPECTATION_FAILED);
		}
		return new ResponseEntity<>("Customer has been deleted!", HttpStatus.OK);
	}

	@DeleteMapping("/customers/delete")
	public ResponseEntity<String> deleteAllCustomers() {
		try {
			customerRepository.deleteAll().subscribe();
		} catch (Exception e) {
			return new ResponseEntity<>("Fail to delete!", HttpStatus.EXPECTATION_FAILED);
		}
		return new ResponseEntity<>("All customers have been deleted!", HttpStatus.OK);
	}

	@GetMapping("/customers/findbyname")
	public Flux<Customer> findByName(@RequestParam String name) {
		return customerRepository.findByName(name);
	}
}

In the rest controller methods which are annotated by @RequestMapping, we have used some methods of autowired repository which are implemented interface ReactiveCrudRepository:

public interface ReactiveCrudRepository<T, ID> extends Repository<T, ID> {

	<S extends T> Mono<S> save(S entity);
	Mono<T> findById(ID id);
	Flux<T> findAll();
	Mono<Void> deleteById(ID id);
	Mono<Void> deleteAll();
	// ...
}

And findByName method that we create in our interface ReactiveCustomerRepository:

public interface ReactiveCustomerRepository extends ReactiveCrudRepository<Customer, String> {
	Flux<Customer> findByName(String name);
}

Remember that we want to connect to backend from a client application deployed in a different port, so we must enable CORS using @CrossOrigin annotation.

3. Reactive Angular Client

3.1 Reactive Service

This service interacts with the backend using Server-Sent Events.

import { Injectable } from '@angular/core';
import { HttpClient, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import * as EventSource from 'eventsource';

@Injectable()
export class CustomerService {

  private baseUrl = 'http://localhost:8080/api/customers';
  private customersList: Customer[] = new Array();
  private customersListSearch: Customer[] = new Array();

  constructor(private http: HttpClient) {
  }

  createCustomer(customer: Object): Observable<Object> {
    return this.http.post(`${this.baseUrl}` + `/create`, customer);
  }

  updateCustomer(id: string, value: any): Observable<Object> {
    return this.http.put(`${this.baseUrl}/${id}`, value);
  }

  deleteCustomer(id: string): Observable<any> {
    return this.http.delete(`${this.baseUrl}/${id}`, { responseType: 'text' });
  }

  getCustomersList(): Observable<any> {
    this.customersList = new Array();

    return Observable.create((observer) => {
      const eventSource = new EventSource(`${this.baseUrl}`);
      eventSource.onmessage = (event) => {
        console.log('eventSource.onmessage: ', event);
        const json = JSON.parse(event.data);
        this.customersList.push(new Customer(json['id'], json['name'], json['age'], json['active']));
        observer.next(this.customersList);
      };
      eventSource.onerror = (error) => observer.error('eventSource.onerror: ' + error);
      return () => eventSource.close();
    });
  }

  deleteAll(): Observable<any> {
    return this.http.delete(`${this.baseUrl}` + `/delete`, { responseType: 'text' });
  }

  findCustomers(name): Observable<any> {
    this.customersListSearch = new Array();

    return Observable.create((observer) => {
      const eventSource = new EventSource(`${this.baseUrl}` + `/findbyname?name=` + name);
      eventSource.onmessage = (event) => {
        console.log('eventSource.onmessage: ', event);
        const json = JSON.parse(event.data);
        this.customersListSearch.push(new Customer(json['id'], json['name'], json['age'], json['active']));
        observer.next(this.customersListSearch);
      };
      eventSource.onerror = (error) => observer.error('eventSource.onerror: ' + error);
      return () => eventSource.close();
    });
  }
}

Whenever we receive an event through the EventSource object, onmessage() is invoked. That’s where we parse data and update item list.

Using RxJS Observable object, any Observer that subscribed to the Observable we created can receive events when the item list gets updated (when calling observer.next(...)).

For more details about RxJS, please visit:
Introduction to RxJS – Extensions for JavaScript Reactive Streams

3.2 Reactive Component

This Component calls Service above and keep result inside an Observable object:

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';

import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

@Component({
  selector: 'customers-list',
  templateUrl: './customers-list.component.html',
  styleUrls: ['./customers-list.component.css']
})
export class CustomersListComponent implements OnInit {

  customers: Observable<Customer[]>;

  constructor(private customerService: CustomerService) {  }

  ngOnInit() {
    this.reloadData();
  }

  deleteCustomers() {
    this.customerService.deleteAll()
      .subscribe(
        data => console.log(data),
        error => console.log('ERROR: ' + error)
      );
  }

  reloadData() {
    this.customers = this.customerService.getCustomersList();
  }
}

In HTML template, we add async pipe that subscribes to the Observable and update component whenever a new event comes:

<div *ngFor="let customer of customers | async">
	<customer-details [customer]='customer'></customer-details>
</div>

<div>
	<button type="button" class="button btn-danger" (click)='deleteCustomers()'>Delete All</button>
</div>

III. Practice

1. Reactive Spring Boot Server

1.1 Project Structure

angular-4-spring-webflux-reactive-mongodb-spring-boot-server-structure

– Class Customer corresponds to document in customer collection.
ReactiveCustomerRepository is an interface extends ReactiveCrudRepository, will be autowired in CustomerController for implementing repository methods.
CustomerController is a REST Controller which has request mapping methods for RESTful requests such as: getAll, create, update, delete Customers.
– Configuration for Spring Data MongoDB properties in application.properties
– Dependencies for Spring Boot WebFlux and Spring Data MongoDB in pom.xml

1.2 Dependency

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

1.3 Data Model


package com.javasampleapproach.reactive.mongodb.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "customer")
public class Customer {
	@Id
	private String id;

	private String name;
	private int age;
	private boolean active;

	public Customer() {
	}

	public Customer(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return this.age;
	}

	public boolean isActive() {
		return active;
	}

	public void setActive(boolean active) {
		this.active = active;
	}

	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", age=" + age + ", active=" + active + "]";
	}
}

1.4 Reactive Repository

package com.javasampleapproach.reactive.mongodb.repo;

import org.springframework.data.repository.reactive.ReactiveCrudRepository;

import com.javasampleapproach.reactive.mongodb.model.Customer;

import reactor.core.publisher.Flux;

public interface ReactiveCustomerRepository extends ReactiveCrudRepository<Customer, String> {

	Flux<Customer> findByName(String name);
}

1.5 Enable reactive Spring Data MongoDB


package com.javasampleapproach.reactive.mongodb.config;

import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;

import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;

@EnableReactiveMongoRepositories
public class MongoDbReactiveConfig extends AbstractReactiveMongoConfiguration {

	@Override
	public MongoClient reactiveMongoClient() {
		return MongoClients.create();
	}

	@Override
	protected String getDatabaseName() {
		return "jsa_mongodb";
	}

}

1.6 REST Controller


package com.javasampleapproach.reactive.mongodb.controller;

import java.time.Duration;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.javasampleapproach.reactive.mongodb.model.Customer;
import com.javasampleapproach.reactive.mongodb.repo.ReactiveCustomerRepository;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping(value = "/api")
public class CustomerController {

	@Autowired
	ReactiveCustomerRepository customerRepository;

	@GetMapping("/customers")
	public Flux getAllCustomers() {
		System.out.println("Get all Customers...");

		return customerRepository.findAll().delayElements(Duration.ofMillis(1000));
	}

	@PostMapping("/customers/create")
	public Mono createCustomer(@Valid @RequestBody Customer customer) {
		System.out.println("Create Customer: " + customer.getName() + "...");

		customer.setActive(false);
		return customerRepository.save(customer);
	}

	@PutMapping("/customers/{id}")
	public Mono> updateCustomer(@PathVariable("id") String id,
			@RequestBody Customer customer) {
		System.out.println("Update Customer with ID = " + id + "...");

		return customerRepository.findById(id).flatMap(customerData -> {
			customerData.setName(customer.getName());
			customerData.setAge(customer.getAge());
			customerData.setActive(customer.isActive());
			return customerRepository.save(customerData);
		}).map(updatedcustomer -> new ResponseEntity<>(updatedcustomer, HttpStatus.OK))
				.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
	}

	@DeleteMapping("/customers/{id}")
	public ResponseEntity deleteCustomer(@PathVariable("id") String id) {
		System.out.println("Delete Customer with ID = " + id + "...");

		try {
			customerRepository.deleteById(id).subscribe();
		} catch (Exception e) {
			return new ResponseEntity<>("Fail to delete!", HttpStatus.EXPECTATION_FAILED);
		}

		return new ResponseEntity<>("Customer has been deleted!", HttpStatus.OK);
	}

	@DeleteMapping("/customers/delete")
	public ResponseEntity deleteAllCustomers() {
		System.out.println("Delete All Customers...");

		try {
			customerRepository.deleteAll().subscribe();
		} catch (Exception e) {
			return new ResponseEntity<>("Fail to delete!", HttpStatus.EXPECTATION_FAILED);
		}

		return new ResponseEntity<>("All customers have been deleted!", HttpStatus.OK);
	}

	@GetMapping("/customers/findbyname")
	public Flux findByName(@RequestParam String name) {

		return customerRepository.findByName(name).delayElements(Duration.ofMillis(1000));
	}
}

To make the result live, we use delayElements(). It causes a delayed time between 2 events.

1.7 Configuration for Spring Data MongoDB

application.properties


spring.data.mongodb.database=jsa_mongodb
spring.data.mongodb.port=27017

2. Reactive Angular Client

2.1 User Interface

angular-4-spring-webflux-reactive-mongodb-angular-client-ui

2.2 Project Structure

angular-4-spring-webflux-reactive-mongodb-angular-client-structure

In this example, we have:
– 4 components: customers-list, customer-details, create-customer, search-customers.
– 3 modules: FormsModule, HttpClientModule, AppRoutingModule.
customer.ts: class Customer (id, name, age, active).
customer.service.ts: Service for HttpClient methods.

2.3 AppModule

app.module.ts


import { AppRoutingModule } from './app-routing.module';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';

import { CustomersListComponent } from './customers/customers-list/customers-list.component';
import { CustomerDetailsComponent } from './customers/customer-details/customer-details.component';
import { CreateCustomerComponent } from './customers/create-customer/create-customer.component';
import { SearchCustomersComponent } from './customers/search-customers/search-customers.component';

import { CustomerService } from './customers/customer.service';

@NgModule({
  declarations: [
    AppComponent,
    CustomersListComponent,
    CustomerDetailsComponent,
    CreateCustomerComponent,
    SearchCustomersComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    AppRoutingModule,
    HttpClientModule
  ],
  providers: [CustomerService],
  bootstrap: [AppComponent]
})

export class AppModule { }

2.4 Model

customer.ts


export class Customer {
  id: string;
  name: string;
  age: number;
  active: boolean;

  constructor(id?: string, name?: string, age?: number, active?: boolean) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.active = active;
  }
}

2.5 Service

customer.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import * as EventSource from 'eventsource';

import { Customer } from './customer';

@Injectable()
export class CustomerService {

  private baseUrl = 'http://localhost:8080/api/customers';
  private customersList: Customer[] = new Array();
  private customersListSearch: Customer[] = new Array();

  constructor(private http: HttpClient) {
  }

  createCustomer(customer: Object): Observable<Object> {
    return this.http.post(`${this.baseUrl}` + `/create`, customer);
  }

  updateCustomer(id: string, value: any): Observable<Object> {
    return this.http.put(`${this.baseUrl}/${id}`, value);
  }

  deleteCustomer(id: string): Observable<any> {
    return this.http.delete(`${this.baseUrl}/${id}`, { responseType: 'text' });
  }

  getCustomersList(): Observable<any> {
    this.customersList = new Array();

    return Observable.create((observer) => {
      const eventSource = new EventSource(`${this.baseUrl}`);
      eventSource.onmessage = (event) => {
        console.log('eventSource.onmessage: ', event);
        const json = JSON.parse(event.data);
        this.customersList.push(new Customer(json['id'], json['name'], json['age'], json['active']));
        observer.next(this.customersList);
      };

      eventSource.onerror = (error) => observer.error('eventSource.onerror: ' + error);

      return () => eventSource.close();
    });
  }

  deleteAll(): Observable<any> {
    return this.http.delete(`${this.baseUrl}` + `/delete`, { responseType: 'text' });
  }

  findCustomers(name): Observable<any> {
    this.customersListSearch = new Array();

    return Observable.create((observer) => {
      const eventSource = new EventSource(`${this.baseUrl}` + `/findbyname?name=` + name);
      eventSource.onmessage = (event) => {
        console.log('eventSource.onmessage: ', event);
        const json = JSON.parse(event.data);
        this.customersListSearch.push(new Customer(json['id'], json['name'], json['age'], json['active']));
        observer.next(this.customersListSearch);
      };

      eventSource.onerror = (error) => observer.error('eventSource.onerror: ' + error);

      return () => eventSource.close();
    });
  }
}

2.6 Components

2.6.1 CustomerDetailsComponent

customer-details.component.ts

import { Component, OnInit, Input } from '@angular/core';

import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

import { CustomersListComponent } from '../customers-list/customers-list.component';

@Component({
  selector: 'customer-details',
  templateUrl: './customer-details.component.html',
  styleUrls: ['./customer-details.component.css']
})
export class CustomerDetailsComponent implements OnInit {

  @Input() customer: Customer;

  constructor(private customerService: CustomerService, private listComponent: CustomersListComponent) { }

  ngOnInit() {
  }

  updateActive(isActive: boolean) {
    this.customerService.updateCustomer(this.customer.id,
      { name: this.customer.name, age: this.customer.age, active: isActive })
      .subscribe(
        data => {
          console.log(data);
          this.customer = data as Customer;
        },
        error => console.log(error)
      );
  }

  deleteCustomer() {
    this.customerService.deleteCustomer(this.customer.id)
      .subscribe(
        data => {
          console.log(data);
          this.listComponent.reloadData();
        },
        error => console.log(error)
      );
  }

}

customer-details.component.html

<div *ngIf="customer">
	<div>
		<label>Name: </label> {{customer.name}}
	</div>
	<div>
		<label>Age: </label> {{customer.age}}
	</div>
	<div>
		<label>Active: </label> {{customer.active}}
	</div>

	<span class="button is-small btn-primary" *ngIf='customer.active' (click)='updateActive(false)'>Inactive</span>

	<span class="button is-small btn-primary" *ngIf='!customer.active' (click)='updateActive(true)'>Active</span>

	<span class="button is-small btn-danger" (click)='deleteCustomer()'>Delete</span>

	<hr/>
</div>
2.6.2 CustomersListComponent

customers-list.component.ts

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Observable';

import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

@Component({
  selector: 'customers-list',
  templateUrl: './customers-list.component.html',
  styleUrls: ['./customers-list.component.css']
})
export class CustomersListComponent implements OnInit {

  customers: Observable<Customer[]>;

  constructor(private customerService: CustomerService, private router: Router) { }

  ngOnInit() {
    this.reloadData();
  }

  deleteCustomers() {
    this.customerService.deleteAll()
      .subscribe(
        data => {
          console.log(data);
          this.navigateToAdd();
        },
        error => console.log('ERROR: ' + error)
      );
  }

  reloadData() {
    this.customers = this.customerService.getCustomersList();
  }

  navigateToAdd() {
    this.router.navigate(['add']);
  }
}

customers-list.component.html


<br/>
<div *ngFor="let customer of customers | async" style="width: 300px;">
	<customer-details [customer]='customer'></customer-details>
</div>

<div>
	<button type="button" class="button btn-danger" (click)='deleteCustomers()'>Delete All</button>
</div>
2.6.3 CreateCustomerComponent

create-customer.component.ts


import { Component, OnInit } from '@angular/core';
import { FormsModule } from '@angular/forms';

import { Customer } from '../customer';
import { CustomerService } from '../customer.service';

@Component({
  selector: 'create-customer',
  templateUrl: './create-customer.component.html',
  styleUrls: ['./create-customer.component.css']
})
export class CreateCustomerComponent implements OnInit {

  customer: Customer = new Customer();
  submitted = false;

  constructor(private customerService: CustomerService) { }

  ngOnInit() {
  }

  newCustomer(): void {
    this.submitted = false;
    this.customer = new Customer();
  }

  save() {
    this.customerService.createCustomer(this.customer)
      .subscribe(data => console.log(data), error => console.log(error));
    this.customer = new Customer();
  }

  onSubmit() {
    this.submitted = true;
    this.save();
  }
}

create-customer.component.html

<h3>Create Customer</h3>
<div [hidden]="submitted" style="width: 300px;">
	<form (ngSubmit)="onSubmit()">
		<div class="form-group">
			<label for="name">Name</label> <input type="text"
				class="form-control" id="name" required [(ngModel)]="customer.name"
				name="name">
		</div>

		<div class="form-group">
			<label for="age">Age</label> <input type="text"
				class="form-control" id="age" required [(ngModel)]="customer.age"
				name="age">
		</div>

		<button type="submit" class="btn btn-success">Submit</button>
	</form>
</div>

<div [hidden]="!submitted">
	<h4>You submitted successfully!</h4>
	<button class="btn btn-success" (click)="newCustomer()">Add</button>
</div>
2.6.4 SearchCustomersComponent

search-customers.component.ts

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';

import { CustomerService } from '../customer.service';
import { Customer } from '../customer';

@Component({
  selector: 'search-customers',
  templateUrl: './search-customers.component.html',
  styleUrls: ['./search-customers.component.css']
})
export class SearchCustomersComponent implements OnInit {

  customers: Observable<Customer[]>;
  name: string;

  constructor(private customerService: CustomerService) { }

  ngOnInit() {
    this.name = '';
  }

  search() {
    this.customers = this.customerService.findCustomers(this.name);
  }
}

search-customers.component.html

<h3>Find Customers By Name</h3>
<input type="text" [(ngModel)]="name" placeholder="enter name" class="input">
 
<button class="btn btn-success" (click)="search()">Search</button>
<hr />
<ul>
	<li *ngFor="let customer of customers | async">
		<h5>{{customer.name}} - Age: {{customer.age}} - Active:	{{customer.active}}</h5>
	</li>
</ul>

2.7 AppRoutingModule

app-routing.module.ts


import { CreateCustomerComponent } from './customers/create-customer/create-customer.component';
import { CustomersListComponent } from './customers/customers-list/customers-list.component';
import { SearchCustomersComponent } from './customers/search-customers/search-customers.component';

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  { path: '', redirectTo: 'customers', pathMatch: 'full' },
  { path: 'customers', component: CustomersListComponent },
  { path: 'add', component: CreateCustomerComponent },
  { path: 'search', component: SearchCustomersComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})

export class AppRoutingModule { }

2.8 App Component

app.component.ts


import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})

export class AppComponent {
  title = 'JavaSampleApproach';
  description = 'Angular4-MongoDB';

  constructor() { }

}

app.component.html

<div class="container-fluid">
	<div style="color: blue;">
		<h1>{{title}}</h1>
		<h3>{{description}}</h3>
	</div>

	<nav>
		<a routerLink="customers" class="btn btn-primary active" role="button" routerLinkActive="active">Customers</a>
		<a routerLink="add" class="btn btn-primary active" role="button" routerLinkActive="active">Add</a>
		<a routerLink="search" class="btn btn-primary active" role="button" routerLinkActive="active">Search</a>
	</nav>
	<router-outlet></router-outlet>
</div>

3. Run & Check Result

Build and Run Spring Boot project with commandlines: mvn clean install and mvn spring-boot:run.
– Run the Angular App with command: npm start.

– Open browser with url http://localhost:4200/, add some Customers.
– Click on Customers tab, each Customer displays one after another with 1s delayed time.

angular-4-spring-webflux-reactive-mongodb-result

– Click on Search tab, search ‘Jack’, the result shows each Customer one after another with 1s delayed time.

angular-4-spring-webflux-reactive-mongodb-result-search

IV. Source Code

SpringDataReactiveMongoDB
ReactiveAngularMongoDB

2,057 thoughts on “Angular 13 Spring WebFlux MongoDB CRUD Operations”

  1. An die Stelle der träumen zu Erreichen der groß Goldmine und Aufwickeln um
    unkomplizierte Straße, die Wettkunden muss kamen in der Abschluss
    die Quoten werden klar gestapelt gegen ihn, und auch dieses wird nie
    auftreten.

  2. My oh my appears as if your blog المعلومة الحرة … إتفاقية بين هندسة نت وويكيبيديا | هندسة نت dined on our first comment it’s extremely extensive) we think I’ll just sum it up the things i wrote and state, I am relishing your website. I as well are an ambitious web site writer however I am still a new comer to the whole thing. Do you possess any suggestions regarding first-time blog writers I’d definitely appreciate it… OMG how about Gaddafi incredible news flash. Thx ! Chlorine Water Treatment

  3. My husband and i have been very peaceful Michael could deal with his homework because of the precious recommendations he was given when using the weblog. It is now and again perplexing to just possibly be handing out thoughts some other people may have been selling. And we remember we now have the website owner to thank because of that. The type of explanations you’ve made, the simple blog navigation, the relationships you can give support to instill – it’s got all powerful, and it’s really helping our son in addition to our family reason why the concept is brilliant, which is certainly quite fundamental. Many thanks for all the pieces!

  4. What’s Happening i am new to this, I stumbled upon this I’ve found It positively useful and it has aided me out loads. I hope to contribute & assist other users like its aided me. Great job.

  5. Good day! This is my first comment here so I just wanted to give a quick shout out and tell you I truly enjoy reading your articles. Can you suggest any other blogs/websites/forums that deal with the same topics? Thank you so much!

  6. I was just looking for this information for a while. After six hours of continuous Googleing, finally I got it in your website. I wonder what is the lack of Google strategy that don’t rank this kind of informative web sites in top of the list. Usually the top sites are full of garbage.

  7. I’m really enjoying the design and layout of your website. It’s a very easy on the eyes which makes it much more pleasant for me to come here and visit more often. Did you hire out a developer to create your theme? Great work!

  8. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You clearly know what youre talking about, why throw away your intelligence on just posting videos to your blog when you could be giving us something enlightening to read?

  9. Thank you for the sensible critique. Me and my neighbor were just preparing to do some research on this. We got a grab a book from our local library but I think I learned more clear from this post. I am very glad to see such wonderful info being shared freely out there.

  10. Heya fantastic website! Does running a blog such as this require a great deal of work?
    I have very little understanding of computer programming but I
    was hoping to start my own blog in the near future.

    Anyway, should you have any suggestions or techniques for new blog owners please share.
    I understand this is off topic but I just needed to
    ask. Many thanks!

  11. I do not know whether it’s just me or if perhaps everybody else
    experiencing issues with your website. It appears as if some of
    the text on your content are running off the screen. Can someone else please comment
    and let me know if this is happening to them too?
    This could be a problem with my browser because I’ve had this happen previously.
    Thanks

  12. Great weblog here! Also your web site a lot up fast!
    What host are you the use of? Can I am getting your affiliate link for your host?
    I desire my site loaded up as fast as yours lol

  13. I loved as much as you will receive carried out right here.
    The sketch is attractive, your authored material stylish.
    nonetheless, you command get bought an nervousness over that you wish be delivering the following.

    unwell unquestionably come further formerly again since exactly the
    same nearly very often inside case you shield this hike.

  14. May I simply just say what a relief to uncover a person that really knows what
    they are discussing on the internet. You definitely know
    how to bring an issue to light and make it important.
    A lot more people must read this and understand this side of the story.
    I can’t believe you are not more popular because you most certainly have the gift.

  15. First off I would like to say wonderful blog!
    I had a quick question in which I’d like to ask if you do not mind.

    I was interested to know how you center yourself and clear your thoughts
    before writing. I’ve had a hard time clearing my mind in getting my ideas out there.
    I do take pleasure in writing however it just
    seems like the first 10 to 15 minutes are wasted just trying to figure out how to begin. Any recommendations or hints?
    Cheers!

  16. Thanks a lot for sharing this with all people you actually
    understand what you are talking approximately! Bookmarked.
    Kindly also visit my website =). We could have a hyperlink exchange arrangement between us

  17. Hi, I do think this is a great blog. I stumbledupon it 😉 I’m going to come back yet again since i have book marked it.
    Money and freedom is the best way to change, may you be rich and continue to
    help other people.

  18. My programmer is trying to persuade me to move to .net from PHP.
    I have always disliked the idea because of the costs.
    But he’s tryiong none the less. I’ve been using Movable-type
    on a variety of websites for about a year and am worried about switching to another platform.
    I have heard very good things about blogengine.net. Is
    there a way I can import all my wordpress content into it?

    Any kind of help would be really appreciated!

  19. Very nice post. I just stumbled upon your weblog and wanted to mention that I have really loved surfing
    around your blog posts. After all I’ll be subscribing in your rss feed and I hope you write again soon!

  20. You actually make it seem so easy with your presentation but I find this matter to be
    actually something which I think I would never understand.

    It seems too complex and very broad for me. I’m looking forward for your next post, I’ll try to get the
    hang of it!

  21. Great weblog here! Additionally your web site rather a lot
    up fast! What host are you using? Can I am getting your associate link on your host?
    I desire my site loaded up as fast as yours lol

  22. I’ve been surfing online more than 2 hours today, yet I never found any
    interesting article like yours. It is pretty worth
    enough for me. In my opinion, if all website owners and
    bloggers made good content as you did, the internet will be
    much more useful than ever before.

  23. First of all I would like to say great blog! I had a quick question in which I’d
    like to ask if you do not mind. I was curious
    to find out how you center yourself and clear your head prior to writing.
    I’ve had a difficult time clearing my thoughts in getting my ideas out.
    I truly do enjoy writing but it just seems like the first 10 to
    15 minutes tend to be wasted simply just trying to figure out how to
    begin. Any suggestions or tips? Appreciate it!

  24. Nice post. I was checking continuously this blog and I’m impressed!
    Very helpful info specially the last part 🙂 I care for such info much.
    I was seeking this particular info for a very long time.
    Thank you and best of luck.

  25. Good day! I could have sworn I’ve visited this website before but after looking
    at a few of the posts I realized it’s new to me.
    Anyhow, I’m certainly happy I stumbled upon it and I’ll be bookmarking
    it and checking back regularly!

  26. Do you have a spam problem on this blog; I also am a blogger, and I was wanting to know your
    situation; many of us have developed some nice procedures and we are looking to exchange solutions with others, why not shoot me an e-mail if
    interested.

  27. I think that what you wrote made a lot of sense.
    But, what about this? suppose you added a little content?
    I mean, I don’t wish to tell you how to run your
    blog, however suppose you added something that makes people
    want more? I mean ozenero | Mobile & Web Programming Tutorials is a little boring.
    You could peek at Yahoo’s front page and note how they create article
    headlines to get people to open the links. You might add a video
    or a picture or two to get people excited about everything’ve written. In my opinion, it could make
    your website a little bit more interesting.

  28. I’m truly enjoying the design and layout of your website.
    It’s a very easy on the eyes which makes it much
    more pleasant for me to come here and visit more
    often. Did you hire out a developer to create your theme?
    Outstanding work!

  29. You actually make it seem so easy with your presentation but I find this topic to be really something that I think I would never understand.
    It seems too complicated and very broad for me. I’m looking forward for your next post, I will
    try to get the hang of it!

  30. After I initially left a comment I appear to have clicked
    the -Notify me when new comments are added- checkbox and now every time a comment
    is added I receive 4 emails with the same comment. Perhaps there
    is a way you can remove me from that service? Many thanks!

  31. Do you have a spam issue on this blog; I also am a blogger, and I
    was wanting to know your situation; we have developed some nice procedures and
    we are looking to swap strategies with others,
    be sure to shoot me an e-mail if interested.

  32. You actually make it appear really easy together with your presentation but I in finding
    this matter to be actually one thing which I
    feel I might never understand. It seems too complex and very wide
    for me. I am looking forward on your next put up,
    I’ll attempt to get the grasp of it!

  33. Hello! This is kind of off topic but I need some help
    from an established blog. Is it very difficult to set up your
    own blog? I’m not very techincal but I can figure things out pretty fast.
    I’m thinking about setting up my own but I’m not sure where to start.
    Do you have any ideas or suggestions? Thanks

  34. Hi! I know this is kind of off topic but I was wondering if you knew
    where I could locate a captcha plugin for my comment form?
    I’m using the same blog platform as yours and I’m having trouble
    finding one? Thanks a lot!

  35. Very nice post. I just stumbled upon your weblog and wished to say that I have truly enjoyed browsing your blog posts.
    After all I will be subscribing to your rss feed
    and I hope you write again very soon!

  36. An intriguing discussion is definitely worth comment.
    I do believe that you ought to publish more on this subject, it may not be a taboo matter
    but typically people do not talk about these
    subjects. To the next! All the best!!

  37. Great beat ! I would like to apprentice whilst you amend your site, how can i subscribe for a blog website?

    The account helped me a applicable deal. I have been a little bit acquainted of
    this your broadcast provided bright transparent concept

  38. Thank you for any other informative blog. The place else may I get that kind of information written in such an ideal approach?
    I have a venture that I am simply now operating on, and I’ve been on the glance
    out for such info.

  39. First of all I want to say terrific blog! I had a quick question that I’d like to ask if you don’t mind.
    I was curious to find out how you center yourself
    and clear your head prior to writing. I’ve had difficulty clearing my
    mind in getting my thoughts out. I do enjoy writing but it just seems like the first 10 to 15 minutes are wasted simply just trying to figure
    out how to begin. Any recommendations or hints? Many thanks!

  40. Today, I went to the beach with my kids. I found a
    sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She placed the shell to her ear and screamed.

    There was a hermit crab inside and it pinched her ear.

    She never wants to go back! LoL I know this is completely off topic but I had to tell
    someone!

  41. Hey! This is my first visit to your blog! We
    are a team of volunteers and starting a new initiative in a
    community in the same niche. Your blog provided us useful information to work on.
    You have done a wonderful job!

  42. Hello! I could have sworn I’ve been to this site before but after checking through some of the post I realized it’s new to me.
    Anyhow, I’m definitely happy I found it and I’ll be book-marking and checking back frequently!

  43. Hi, I do think this is an excellent web site. I stumbledupon it 😉 I’m
    going to return yet again since I saved as a favorite it.
    Money and freedom is the best way to change, may you be rich and continue to
    help other people.

  44. hey there and thank you for your information – I have
    certainly picked up anything new from right here.
    I did however expertise several technical issues using this website, as I experienced to
    reload the site lots of times previous to I could get it to load properly.
    I had been wondering if your web host is OK? Not that I am complaining, but slow loading instances times will very frequently affect your placement in google and could damage your quality score if
    advertising and marketing with Adwords. Anyway I’m adding this RSS to my e-mail and could look out for
    much more of your respective fascinating content.
    Ensure that you update this again very soon.

  45. I love your blog.. very nice colors & theme.
    Did you design this website yourself or did you hire someone
    to do it for you? Plz answer back as I’m looking to design my
    own blog and would like to find out where u got this from.
    cheers

  46. What i do not realize is in fact how you are no longer actually much more well-favored than you may be now.
    You are very intelligent. You recognize thus considerably in terms
    of this topic, produced me in my view believe it from so many various angles.

    Its like men and women don’t seem to be involved until it is something to do with Woman gaga!
    Your individual stuffs outstanding. At all times handle it up!

  47. I like the valuable information you provide in your articles.
    I’ll bookmark your blog and check again here frequently.

    I’m quite certain I will learn a lot of new stuff
    right here! Best of luck for the next!

  48. Hi! I know this is kinda off topic but I was wondering if you knew where I could locate a captcha plugin for my comment form?
    I’m using the same blog platform as yours and I’m having problems
    finding one? Thanks a lot!

  49. You can certainly see your enthusiasm in the article you write.
    The sector hopes for more passionate writers such as you who are not afraid
    to mention how they believe. All the time follow your heart.

  50. Hi there would you mind sharing which blog platform you’re using?

    I’m going to start my own blog in the near future but I’m having a difficult time making a decision between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your design and style seems different then most blogs and
    I’m looking for something completely unique. P.S My apologies for being off-topic but I had
    to ask!

  51. Wonderful goods from you, man. I’ve take note your stuff previous to
    and you are just extremely magnificent. I really
    like what you have acquired here, really like what you’re saying and the
    way in which during which you assert it. You make it
    entertaining and you still take care of to stay it wise.
    I cant wait to learn far more from you. That is really a great site.

  52. Hey I know this is off topic but I was wondering if you knew of any widgets I could add to
    my blog that automatically tweet my newest twitter updates.

    I’ve been looking for a plug-in like this for quite some time and was
    hoping maybe you would have some experience with something like this.
    Please let me know if you run into anything. I truly enjoy reading your blog and I look
    forward to your new updates.

  53. Wonderful blog! I found it while surfing around on Yahoo News.

    Do you have any tips on how to get listed in Yahoo News?

    I’ve been trying for a while but I never seem to get there!
    Thanks

  54. Everything wrote made a ton of sense. However, consider this, what
    if you composed a catchier title? I mean, I don’t want to
    tell you how to run your website, however suppose you added a title that makes people want more?
    I mean ozenero | Mobile & Web Programming Tutorials
    is a little vanilla. You might look at Yahoo’s front page and note how
    they create article headlines to grab people to
    click. You might add a related video or a related picture or two to
    get readers interested about everything’ve written. In my opinion, it
    might make your website a little livelier.

  55. With havin so much written content do you ever run into
    any issues of plagorism or copyright violation? My website has a lot of
    exclusive content I’ve either created myself or outsourced but it
    appears a lot of it is popping it up all over the web without my authorization. Do you know any techniques to help protect against content from being stolen? I’d certainly appreciate it.

  56. First of all I want to say fantastic blog!
    I had a quick question that I’d like to ask if you do not mind.
    I was curious to find out how you center yourself and clear your thoughts prior to
    writing. I have had a tough time clearing my mind in getting my thoughts out there.
    I do enjoy writing but it just seems like the first 10 to 15 minutes tend to be lost just trying to figure out how to begin. Any ideas or tips?

    Kudos!

  57. Simply desire to say your article is as surprising. The clarity to your publish is simply great and i
    could assume you are knowledgeable in this subject.
    Well along with your permission allow me to take hold
    of your feed to stay updated with impending
    post. Thanks 1,000,000 and please carry on the enjoyable work.

  58. That is a really good tip especially to those fresh to the blogosphere.
    Simple but very accurate info… Many
    thanks for sharing this one. A must read post!

  59. It’s in fact very complex in this busy life to listen news on Television, therefore I just use world wide web
    for that purpose, and take the most recent information.

  60. Hmm is anyone else experiencing problems with the images on this blog loading?
    I’m trying to determine if its a problem on my end or if it’s the blog.
    Any suggestions would be greatly appreciated.

  61. Oh my goodness! Incredible article dude! Many thanks,
    However I am going through issues with your RSS.
    I don’t understand the reason why I am unable to
    join it. Is there anyone else getting similar RSS problems?
    Anyone that knows the answer will you kindly respond?
    Thanx!!

  62. Hi! I know this is kinda off topic nevertheless I’d
    figured I’d ask. Would you be interested in exchanging links or maybe guest writing
    a blog article or vice-versa? My blog covers a lot of the same subjects as yours and I feel we could greatly benefit from each other.
    If you are interested feel free to send me an email. I look forward to hearing from you!
    Excellent blog by the way!

  63. Hi! Do you know if they make any plugins to help with Search Engine Optimization? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good results.
    If you know of any please share. Thank you!

  64. May I just say what a relief to uncover someone that
    actually knows what they’re discussing on the web. You certainly realize how to
    bring an issue to light and make it important. More and more people
    should read this and understand this side of the story. I was surprised that you’re not more popular because you surely have
    the gift.

  65. I know this if off topic but I’m looking into starting my own blog and was curious what all
    is required to get setup? I’m assuming having a blog like yours would cost a pretty penny?

    I’m not very internet smart so I’m not 100% sure.

    Any recommendations or advice would be greatly appreciated.
    Kudos

  66. Just desire to say your article is as astounding. The clarity in your post is just nice and i can assume you’re
    an expert on this subject. Well with your permission allow me to grab your feed to keep up to date with
    forthcoming post. Thanks a million and please carry on the
    gratifying work.

  67. I think that everything posted was very reasonable.
    But, think about this, what if you wrote a catchier title?
    I am not saying your information is not solid., however suppose
    you added something to maybe get people’s attention? I mean ozenero
    | Mobile & Web Programming Tutorials is a little plain. You might peek
    at Yahoo’s front page and see how they create article headlines to grab people
    to click. You might add a video or a related pic or two to grab people interested about everything’ve got to say.
    Just my opinion, it would bring your website a little bit more interesting.

  68. Hello! I know this is kind of off topic but I was wondering which blog platform are you using for this site?

    I’m getting tired of WordPress because I’ve had issues with hackers and I’m looking at alternatives for another
    platform. I would be great if you could point me in the direction of a good platform.

  69. I’m amazed, I must say. Seldom do I encounter a blog that’s both educative and engaging, and let me
    tell you, you have hit the nail on the head.
    The issue is something that not enough men and women are speaking intelligently
    about. Now i’m very happy I found this during my search for something relating
    to this.

  70. Neat blog! Is your theme custom made or did you download it from somewhere?
    A design like yours with a few simple adjustements would really make my blog stand out.
    Please let me know where you got your theme. Bless you

  71. Thanks for a marvelous posting! I really enjoyed reading it, you could be a great author.I
    will be sure to bookmark your blog and may come back later on. I want to encourage you continue your great writing, have a nice
    weekend!

  72. Hey very nice web site!! Guy .. Excellent ..
    Wonderful .. I’ll bookmark your web site and take the feeds additionally?
    I’m happy to search out a lot of helpful information here in the post, we’d like work out more strategies in this regard, thank you for sharing.
    . . . . .

  73. I love your blog.. very nice colors & theme.
    Did you make this website yourself or did you hire someone to do it for you?
    Plz respond as I’m looking to design my own blog and would like to
    know where u got this from. thank you

  74. First of all I want to say wonderful blog! I had a quick question that I’d like to ask if you don’t mind.
    I was curious to find out how you center yourself and clear your thoughts prior to writing.
    I have had a tough time clearing my thoughts in getting my thoughts out.

    I do enjoy writing however it just seems like the first
    10 to 15 minutes tend to be lost just trying to figure out how
    to begin. Any ideas or hints? Many thanks!

  75. I have been surfing online more than 4 hours today, yet I never found any
    interesting article like yours. It is pretty worth enough for me.
    In my view, if all webmasters and bloggers made good content as you did,
    the web will be much more useful than ever before.

  76. Howdy very nice site!! Man .. Excellent .. Amazing .. I’ll bookmark your blog and take the feeds
    additionally? I am glad to search out numerous helpful info right here in the put up, we’d like develop extra techniques
    on this regard, thanks for sharing. . . . . .

  77. Write more, thats all I have to say. Literally,
    it seems as though you relied on the video to make your point.

    You obviously know what youre talking about, why throw away your intelligence on just posting
    videos to your weblog when you could be giving us something
    informative to read?

  78. Howdy very cool web site!! Guy .. Beautiful .. Amazing ..
    I’ll bookmark your blog and take the feeds additionally?
    I am glad to seek out numerous useful info
    right here within the post, we want work out extra techniques in this regard,
    thank you for sharing. . . . . .

  79. Heya! I realize this is sort of off-topic but
    I needed to ask. Does managing a well-established blog like yours take
    a large amount of work? I am brand new to blogging however I do write in my journal on a daily basis.
    I’d like to start a blog so I will be able to
    share my own experience and feelings online. Please let me know if you have any kind of suggestions or tips for
    brand new aspiring bloggers. Thankyou!

  80. We are a group of volunteers and opening a new scheme in our community.

    Your web site provided us with valuable info to work
    on. You have done an impressive job and our entire community will be thankful to you.

  81. Heya this is somewhat of off topic but I was wanting to know if blogs use WYSIWYG
    editors or if you have to manually code with HTML. I’m starting a blog soon but have
    no coding experience so I wanted to get guidance from someone with experience.
    Any help would be enormously appreciated!

  82. Howdy just wanted to give you a quick heads up. The text in your content seem to be running off the screen in Ie.
    I’m not sure if this is a format issue or something to do with browser compatibility but I figured I’d post to
    let you know. The design look great though! Hope you get the
    issue fixed soon. Thanks

  83. obviously like your website but you need to check the spelling on quite a few of your posts.
    Several of them are rife with spelling problems and I in finding it very
    troublesome to tell the reality on the other hand I’ll definitely come back again.

  84. hey there and thank you for your info – I’ve definitely picked up something new from right here.
    I did however expertise some technical points using this site, as I experienced
    to reload the site lots of times previous to I could get it to load correctly.
    I had been wondering if your hosting is OK? Not that I am complaining, but slow loading instances times will
    often affect your placement in google and could damage your
    high quality score if advertising and marketing with Adwords.
    Anyway I am adding this RSS to my email
    and could look out for a lot more of your respective exciting
    content. Ensure that you update this again soon.

  85. Excellent beat ! I would like to apprentice while you amend your web site,
    how can i subscribe for a weblog website? The account aided me a applicable deal.
    I have been a little bit familiar of this your broadcast offered vivid transparent
    concept

  86. you are in reality a excellent webmaster. The web site loading velocity is
    amazing. It kind of feels that you’re doing any unique trick.
    Moreover, The contents are masterpiece. you’ve performed a wonderful job
    in this subject!

  87. I’m not that much of a online reader to be honest but your blogs really nice,
    keep it up! I’ll go ahead and bookmark your website to come back later on. All the best

  88. Greetings, I think your website may be having web browser compatibility problems.

    Whenever I look at your site in Safari, it looks fine but when opening in IE, it’s got some overlapping issues.
    I merely wanted to give you a quick heads up! Other than that, fantastic blog!

  89. I’m pretty pleased to uncover this page. I wanted to thank you for your time for this particularly wonderful read!!
    I definitely loved every little bit of it and I have you book-marked to look at new information on your web site.

  90. Excellent article. Keep writing such kind of info on your site.
    Im really impressed by it.
    Hi there, You have performed a great job. I will certainly
    digg it and personally suggest to my friends. I’m sure they will be benefited from this site.

  91. Admiring the persistence you put into your website and
    in depth information you provide. It’s nice to come across a blog every
    once in a while that isn’t the same old rehashed information. Fantastic read!

    I’ve bookmarked your site and I’m including your RSS feeds to my Google account.

  92. I loved as much as you’ll receive carried out right here.

    The sketch is tasteful, your authored subject matter stylish.
    nonetheless, you command get got an nervousness over that you wish be delivering the following.
    unwell unquestionably come further formerly again as exactly the same nearly very often inside case you shield this increase.

  93. Woah! I’m really enjoying the template/theme of this site.
    It’s simple, yet effective. A lot of times it’s tough to get that “perfect balance” between user
    friendliness and visual appearance. I must say you’ve done a
    great job with this. Also, the blog loads extremely fast for me on Opera.
    Exceptional Blog!

  94. Hi there would you mind letting me know which webhost you’re utilizing?
    I’ve loaded your blog in 3 different web browsers and I must say this blog loads a lot quicker then most.
    Can you recommend a good hosting provider at a honest price?
    Many thanks, I appreciate it!

  95. When I initially commented I clicked the “Notify me when new comments are added”
    checkbox and now each time a comment is added I get three e-mails with the same comment.
    Is there any way you can remove people from that service?
    Thanks a lot!

  96. Woah! I’m really loving the template/theme of this site.
    It’s simple, yet effective. A lot of times it’s
    challenging to get that “perfect balance” between user friendliness and visual appearance.
    I must say that you’ve done a very good job with this.
    Additionally, the blog loads extremely fast for me on Chrome.
    Outstanding Blog!

  97. Howdy just wanted to give you a quick heads up.
    The text in your post seem to be running off the screen in Safari.
    I’m not sure if this is a format issue or something to do with web browser
    compatibility but I thought I’d post to let you know. The design and style look great though!
    Hope you get the problem fixed soon. Thanks

  98. Sweet blog! I found it while browsing on Yahoo News.
    Do you have any suggestions on how to get listed in Yahoo News?
    I’ve been trying for a while but I never seem to get there!
    Thank you

  99. Great post. I was checking continuously this blog
    and I’m impressed! Extremely useful info specifically the last part 🙂 I
    care for such info much. I was seeking this particular information for
    a very long time. Thank you and best of luck.

  100. Thanks for any other informative web site. Where else may just I am getting that
    kind of info written in such a perfect approach?
    I’ve a mission that I’m simply now working on, and I’ve been at the look out for such info.

  101. Today, I went to the beach with my children. I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put
    the shell to her ear and screamed. There was a hermit crab
    inside and it pinched her ear. She never wants to go back!
    LoL I know this is entirely off topic but I had to tell
    someone!

  102. Hi there, I found your web site via Google at the same
    time as searching for a related matter, your site came up, it seems to be great.
    I have bookmarked it in my google bookmarks.
    Hi there, just become aware of your weblog thru Google, and located that it’s really informative.
    I’m going to be careful for brussels. I will appreciate when you
    proceed this in future. Lots of other folks will likely be benefited
    from your writing. Cheers!

  103. Having read this I believed it was really informative. I appreciate
    you taking the time and energy to put this article together.
    I once again find myself personally spending a significant amount of time both reading and leaving
    comments. But so what, it was still worthwhile!

  104. Good day I am so delighted I found your website, I really found you
    by accident, while I was looking on Askjeeve for something else,
    Anyways I am here now and would just like to say thanks a lot for a
    incredible post and a all round entertaining blog
    (I also love the theme/design), I don’t have time to read it
    all at the minute but I have book-marked it and also added in your RSS feeds, so when I have time I
    will be back to read a lot more, Please do keep up the fantastic jo.

  105. Just want to say your article is as astounding. The clearness on your publish is simply cool and that i could suppose you are a professional on this subject.
    Well along with your permission let me to grab your feed to stay up to date with impending
    post. Thank you a million and please continue
    the rewarding work.

  106. Hi there! This article could not be written much better!
    Looking through this post reminds me of my previous roommate!
    He always kept preaching about this. I’ll forward this information to him.
    Fairly certain he’ll have a good read. Many thanks for
    sharing!

  107. It’s a pity you don’t have a donate button! I’d definitely donate to this fantastic blog!
    I guess for now i’ll settle for bookmarking and adding your
    RSS feed to my Google account. I look forward to fresh updates and will share this website with my Facebook group.
    Talk soon!

  108. Howdy! Would you mind if I share your blog with my myspace group?

    There’s a lot of people that I think would
    really enjoy your content. Please let me know.
    Thank you

  109. You could definitely see your skills within the work you write.
    The world hopes for even more passionate writers such as you who aren’t afraid to mention how they believe.
    All the time follow your heart.

  110. Hello there! This blog post couldn’t be written much better!
    Looking at this post reminds me of my previous roommate!
    He always kept preaching about this. I most certainly will send this
    post to him. Pretty sure he’ll have a very good read.
    Thank you for sharing!

  111. I do not know if it’s just me or if perhaps everybody else encountering issues with your site.
    It appears like some of the written text on your content
    are running off the screen. Can somebody else please provide feedback and let me know if this is happening to them as well?
    This may be a issue with my web browser because I’ve had this
    happen before. Thanks

  112. Hi! This post couldn’t be written any better!

    Reading through this post reminds me of my old room mate!

    He always kept chatting about this. I will forward this post to
    him. Fairly certain he will have a good read. Thank you for sharing!

  113. I’m really impressed with your writing skills
    as smartly as with the format on your weblog. Is that this
    a paid topic or did you customize it your self? Anyway keep up
    the excellent quality writing, it is rare to peer a nice weblog like this one
    these days..

  114. Can I simply just say what a relief to discover a person that genuinely knows
    what they’re talking about over the internet. You actually understand how
    to bring an issue to light and make it important. A lot more people need to
    look at this and understand this side of your story.
    I can’t believe you’re not more popular given that you surely have the
    gift.

  115. you’re in reality a good webmaster. The website loading velocity is incredible.
    It sort of feels that you are doing any distinctive trick.
    In addition, The contents are masterwork. you have performed a great activity in this matter!

  116. What i do not understood is in fact how you are not actually much more
    neatly-preferred than you might be right now. You’re so intelligent.

    You realize therefore considerably in the case of this matter, made me
    personally believe it from numerous varied angles. Its like women and men don’t seem to be fascinated except it’s something
    to do with Girl gaga! Your own stuffs outstanding. Always handle it up!

  117. Its like you read my mind! You seem to know a lot
    about this, like you wrote the book in it or something.
    I think that you can do with a few pics to drive the message home a little bit, but other than that, this is great blog.
    An excellent read. I will certainly be back.

  118. Hello there, You have done a fantastic job. I will definitely digg it and personally suggest
    to my friends. I’m sure they will be benefited from this web site.

  119. Terrific work! This is the type of info that are meant to be shared around the net.

    Shame on the search engines for no longer positioning this publish higher!

    Come on over and talk over with my web site .
    Thanks =)

  120. Its like you read my mind! You seem to know so much about this,
    like you wrote the book in it or something. I think that you can do with a few pics to drive
    the message home a little bit, but instead of that, this is fantastic blog.
    A fantastic read. I will definitely be back.

  121. Great beat ! I would like to apprentice while you amend your website, how could i subscribe for a blog web site?
    The account helped me a appropriate deal. I were a little bit acquainted of this your broadcast provided vibrant clear concept

  122. Having read this I believed it was rather enlightening.
    I appreciate you spending some time and effort to put this content together.
    I once again find myself personally spending a lot of time both reading and posting comments.
    But so what, it was still worthwhile!

  123. Hey! This is my 1st comment here so I just wanted to give a quick shout out and say I really enjoy reading through your posts.
    Can you suggest any other blogs/websites/forums that deal with the same topics?
    Thanks a ton!

  124. An outstanding share! I have just forwarded this onto a
    coworker who had been conducting a little research on this.

    And he actually bought me breakfast simply because
    I found it for him… lol. So let me reword this…. Thank
    YOU for the meal!! But yeah, thanks for spending some time to talk about this
    subject here on your website.

  125. Great article! This is the kind of information that are supposed to be shared across the web.
    Shame on the seek engines for now not positioning this publish upper!
    Come on over and talk over with my website . Thanks =)

  126. Unquestionably believe that which you said. Your favorite reason appeared to be on the web the simplest thing to be aware of.
    I say to you, I definitely get irked while people think about worries that they
    just do not know about. You managed to hit the nail upon the top and defined out the
    whole thing without having side effect , people could take a signal.
    Will likely be back to get more. Thanks

  127. You are so awesome! I don’t suppose I’ve read something like this before.
    So great to find someone with genuine thoughts on this subject matter.
    Seriously.. thank you for starting this up. This web site is
    something that is needed on the internet, someone with
    a bit of originality!

  128. It’s genuinely very complicated in this active life to listen news
    on Television, thus I only use internet for
    that reason, and obtain the hottest news.

  129. Hmm is anyone else experiencing problems with the pictures on this blog loading?
    I’m trying to figure out if its a problem on my end or if it’s the
    blog. Any suggestions would be greatly appreciated.

  130. I’m extremely inspired with your writing talents
    as well as with the structure on your blog. Is this a paid subject matter
    or did you customize it your self? Anyway stay up the excellent quality writing, it’s rare to see a great blog like
    this one today..

  131. I was curious if you ever considered changing the structure of your website?
    Its very well written; I love what youve got to say.
    But maybe you could a little more in the way of content so people could connect with
    it better. Youve got an awful lot of text for only
    having 1 or two pictures. Maybe you could space it out better?

  132. Can I just say what a comfort to uncover someone
    that actually understands what they’re talking about on the internet.
    You certainly understand how to bring a problem to light and make it important.
    A lot more people need to check this out and understand this side of your story.

    I was surprised you are not more popular since you
    definitely possess the gift.

  133. An intriguing discussion is definitely worth comment.
    I do believe that you need to publish more about this subject, it may not be a taboo matter
    but generally folks don’t speak about these
    topics. To the next! All the best!!

  134. I am curious to find out what blog platform you happen to be working with?

    I’m experiencing some small security issues with my latest website and I would like to find something
    more safe. Do you have any recommendations?

  135. Its like you read my mind! You seem to know a lot about this,
    like you wrote the book in it or something. I think that you can do
    with a few pics to drive the message home a bit, but instead
    of that, this is fantastic blog. A fantastic read.
    I will definitely be back.

  136. Pretty great post. I just stumbled upon your blog and wished to mention that I have really enjoyed surfing around
    your blog posts. After all I’ll be subscribing for your
    rss feed and I’m hoping you write once more very soon!

  137. hello there and thank you for your info – I’ve definitely picked up anything new from right
    here. I did however expertise some technical issues using this web site,
    since I experienced to reload the web site lots of times previous to I could get it to load properly.
    I had been wondering if your hosting is OK?
    Not that I’m complaining, but slow loading instances times will sometimes affect your placement in google and can damage your high-quality score if ads and marketing with Adwords.

    Anyway I am adding this RSS to my email and could look out for much more
    of your respective interesting content. Make sure you update this again very soon.

  138. After I originally commented I appear to have clicked the
    -Notify me when new comments are added- checkbox and from now on each time a comment is added I receive four emails with
    the exact same comment. There has to be an easy method
    you can remove me from that service? Many thanks!

  139. Hey there! This is my first comment here so I just wanted to give
    a quick shout out and say I really enjoy reading through your
    blog posts. Can you recommend any other blogs/websites/forums that cover the same topics?
    Thanks a ton!

  140. Fantastic blog! Do you have any suggestions for aspiring writers?
    I’m planning to start my own site soon but I’m a little lost
    on everything. Would you recommend starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m totally overwhelmed ..
    Any tips? Kudos!

  141. When someone writes an paragraph he/she maintains the idea of a user in his/her mind that how a user can understand it.

    So that’s why this piece of writing is perfect. Thanks!

  142. It’s a shame you don’t have a donate button! I’d most certainly donate to this
    outstanding blog! I guess for now i’ll settle for
    bookmarking and adding your RSS feed to my Google account.
    I look forward to new updates and will talk about this website with my Facebook group.
    Talk soon!

  143. I like the helpful information you supply for your articles.

    I will bookmark your weblog and test once more right here frequently.
    I’m fairly certain I will be informed plenty of new
    stuff right here! Good luck for the following!

  144. Hey there would you mind stating which blog platform you’re using?
    I’m planning to start my own blog in the near future but I’m
    having a hard time deciding between BlogEngine/Wordpress/B2evolution and Drupal.
    The reason I ask is because your design and style seems different
    then most blogs and I’m looking for something unique.
    P.S Apologies for getting off-topic but I had to ask!

  145. Hey there I am so excited I found your blog page, I really found you by mistake, while I was browsing
    on Bing for something else, Nonetheless I am here now and would just like
    to say thanks a lot for a marvelous post and a all round exciting blog
    (I also love the theme/design), I don’t have time to
    go through it all at the minute but I have book-marked it and also added your RSS feeds, so
    when I have time I will be back to read a lot more, Please do keep up the excellent work.

  146. I was very happy to discover this site. I need to to thank you for your time for this particularly wonderful read!!
    I definitely liked every bit of it and i also have you bookmarked to see new stuff
    on your site.

  147. naturally like your web-site but you have to test the spelling on quite a
    few of your posts. Many of them are rife with spelling problems and
    I in finding it very troublesome to tell the truth
    however I will certainly come back again.

  148. When I initially commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is
    added I get several e-mails with the same comment.
    Is there any way you can remove people from that service?
    Thanks a lot!

  149. I am really inspired with your writing abilities as neatly as with the layout for
    your weblog. Is that this a paid subject or did you modify it your self?
    Anyway stay up the excellent high quality writing, it is uncommon to see a nice weblog like this one today..

  150. Hello, i think that i noticed you visited my blog thus i got here
    to return the want?.I am attempting to in finding things to improve my site!I
    suppose its adequate to use some of your ideas!!

  151. Just want to say your article is as surprising.
    The clarity in your post is just excellent and i can assume you
    are an expert on this subject. Fine with your permission allow
    me to grab your RSS feed to keep updated with forthcoming
    post. Thanks a million and please keep up the gratifying work.

  152. My spouse and I stumbled over here from a different web page and
    thought I might check things out. I like what I see so now i am following you.
    Look forward to looking into your web page for a second time.

  153. Wow, superb blog layout! How long have you been blogging
    for? you make blogging look easy. The overall look of your
    web site is magnificent, let alone the content!

  154. Nice post. I was checking constantly this weblog and I am inspired!
    Very helpful info specially the final section 🙂 I deal
    with such info a lot. I used to be looking for this
    certain information for a very long time. Thanks and best of
    luck.

  155. Do you mind if I quote a few of your articles as long as I provide credit and sources back to your
    weblog? My blog is in the very same area of
    interest as yours and my visitors would certainly benefit from a
    lot of the information you present here. Please let me know if this ok with
    you. Thanks!

  156. It’s a pity you don’t have a donate button! I’d definitely donate to this
    outstanding blog! I guess for now i’ll settle for book-marking and adding your RSS feed
    to my Google account. I look forward to fresh updates and will talk about this website
    with my Facebook group. Talk soon!

  157. Howdy! I know this is sort of off-topic however I had to ask.

    Does building a well-established blog like yours take a large amount of work?
    I am brand new to operating a blog however
    I do write in my journal everyday. I’d like to start a
    blog so I can easily share my experience and views online.
    Please let me know if you have any kind of suggestions or tips for
    new aspiring bloggers. Thankyou!

  158. Have you ever thought about publishing an e-book or guest authoring
    on other blogs? I have a blog based on the same subjects you discuss
    and would love to have you share some stories/information. I know my viewers would value your work.
    If you’re even remotely interested, feel free to send me an e-mail.

  159. You’re so interesting! I don’t think I’ve truly
    read through anything like this before. So great to discover somebody with original thoughts on this issue.
    Seriously.. thanks for starting this up. This web site is one thing
    that is needed on the web, someone with a little originality!

  160. Simply wish to say your article is as surprising. The clearness in your submit is simply cool and
    that i could think you’re knowledgeable in this subject.
    Fine along with your permission let me to grab your RSS feed to stay updated with impending post.
    Thank you one million and please continue the rewarding work.

  161. Hey I know this is off topic but I was wondering if you knew of any widgets I could add
    to my blog that automatically tweet my newest twitter updates.
    I’ve been looking for a plug-in like this for quite some time
    and was hoping maybe you would have some experience
    with something like this. Please let me know if you run into anything.
    I truly enjoy reading your blog and I look forward to your new updates.

  162. Wow, incredible blog layout! How long have you been blogging
    for? you made blogging look easy. The overall look of your website is fantastic, let alone the content!

  163. Thanks for your personal marvelous posting! I definitely enjoyed reading
    it, you might be a great author.I will be sure to bookmark your blog
    and will often come back from now on. I want to encourage one
    to continue your great posts, have a nice afternoon!

  164. whoah this weblog is wonderful i really like reading your articles.
    Stay up the good work! You recognize, lots of people are hunting round for this information, you
    could help them greatly.