blob: 758970019fb186d8fede3956b063a600892a8e1f [file] [log] [blame]
:virgo-homepage: https://eclipse.org/virgo
:guide-short-name: accessing-data-mongodb
:recipe-name: Accessing Data with MongoDB
:recipe-short-name: recipe-{guide-short-name}
:experimental: true
include::../../../../recipe-template/src/docs/asciidoc/00_title.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/01_acknowledgements.adoc[]
== {recipe-name}
The original guide uses https://projects.spring.io/spring-boot/[Spring Boot] to bootstrap the demo application. This guide shows what needs to be done to run {recipe-name} with Virgo.
include::../../../../recipe-template/src/docs/asciidoc/03_shopping-list.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/04_ingredients.adoc[]
* OSGi Metadata
* Spring configuration
== Preparations
include::../../../../recipe-template/src/docs/asciidoc/051_get-the-code.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/052_create-recipe-runtime.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/053_create-eclipse-project-metadata.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/054_prepare-virgo-tooling.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/055_import-the-code.adoc[]
include::../../../../recipe-template/src/docs/asciidoc/056_create-new-virgo-server.adoc[]
== Directions
In the original guide the music plays in the run method of the `CommandLineRunner` of the Spring Boot application.
We are going to transform the `@SpringBootApplication` into a plain `@Component` with an `init`-method.
=== Spring Boot Application
[source,java]
----
@SpringBootApplication // <1>
public class Application implements CommandLineRunner { // <2>
@Autowired private CustomerRepository repository; // <3>
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
public void run(String... args) throws Exception { // <4>
// repository actions...
}
}
----
<1> Will be replaced with a plain `@Component`.
<2> `CommandLineRunner` will be replaced, too.
<3> `@Autowired` is the common denominator.
<4> Will be replaced with a `@PostConstruct` method.
=== Virgoized Application
After the transformation the component looks something like:
[source,java]
----
@Component
public class Application {
@Autowired private CustomerRepository repository;
@PostConstruct
public void init() throws Exception {
// repository actions...
}
}
----
=== Customer
Both: The `Customer`
[source,java]
.Customer
----
include::../../../org.eclipse.virgo.samples.recipe.data.mongodb/src/main/java/org/eclipse/virgo/samples/recipe/data/mongodb/Customer.java[tags=type]
----
=== Customer Repository
and `CustomerRepository` are unchanged:
[source,java]
.CustomerRepository
----
include::../../../org.eclipse.virgo.samples.recipe.data.mongodb/src/main/java/org/eclipse/virgo/samples/recipe/data/mongodb/CustomerRepository.java[tags=type]
----
=== OSGi Metadata
The OSGi metadata is generated from a template:
[source,java]
.template.mf
----
include::../../../org.eclipse.virgo.samples.recipe.data.mongodb/template.mf[]
----
=== Dependency management
While the original guide pulls in it's Spring Data dependencies the Spring Boot way:
[source,groovy]
----
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-mongodb")
...
}
----
we create a custom Virgo runtime and add list the required dependencies more explicit:
[source,groovy]
----
include::../../../recipe-accessing-data-mongodb-runtime/build.gradle[tags=dependencies]
----
=== Spring Boot Demystified
Within the Virgo powered OSGi environment some of the Spring Boot magic becomes visible in `XML`.
[source,xml,indent=0]
----
include::../../../org.eclipse.virgo.samples.recipe.data.mongodb/src/main/resources/META-INF/spring/applicationContext.xml[tags=configuration]
----
<1> Provides a bean `MongoDbFactory`
<2> Configures and provides a bean `MongoTemplate`
<3> Scans provide MongoDB backed `MongoRepository`
<4> Scans the application code for `@Component` s ...
== Let's taste
When the oven is hot - the Virgo Runtime is up and running - you can insert (drag'n'drop) the fresh OSGi bundle.
A quick glimpse into the oven...
[source,sh]
----
$ tail -500f ${VIRGO_HOME}/serviceability/logs/log.log
----
=== the results
Should show the tasty result of our actions:
[source,sh]
.log.log
----
...
System.out Customers found with findAll():
System.out -------------------------------
System.out Customer[id=570fa0b3eec8cfd2c9a99d98, firstName='Alice', lastName='Smith']
System.out Customer[id=570fa0b3eec8cfd2c9a99d99, firstName='Bob', lastName='Smith']
System.out
System.out Customer found with findByFirstName('Alice'):
System.out --------------------------------
System.out Customer[id=570fa0b3eec8cfd2c9a99d98, firstName='Alice', lastName='Smith']
System.out Customers found with findByLastName('Smith'):
System.out --------------------------------
System.out Customer[id=570fa0b3eec8cfd2c9a99d98, firstName='Alice', lastName='Smith']
System.out Customer[id=570fa0b3eec8cfd2c9a99d99, firstName='Bob', lastName='Smith']
...
----
include::08_dockerize_recipe.adoc[]