Title: Injection of DataSource Example
# Overview
{span:style=float: right; margin-left: 20px;}
{html}
{html}
{span}
{div}
In this example we use the *@Resource* annotation to inject a
*javax.sql.DataSource* into our bean. The trickiest thing about injecting
a DataSource is not declaring the annotation, but actually configuring the
data source.
In OpenEJB the rules are quite simple. An declaration like the following
in code:
@Resource DataSource customerDataSource;
Matches a data source declared as follows in the openejb.xml file:
....
As seen in this example, the data source can also be declared via
properties as follows:
customerDataSource = new://Resource?type=DataSource
This style of properties creation can be used in the InitialContext
properties, set into the System properties, or passed in on the command
line as vm properties.
_The source for this example is in the "injection-of-datasource" directory
located in the [openejb-examples.zip](openejb:download.html)
available on the [download page](http://tomee.apache.org/downloads.html)._
{div}
{div:style=clear:both;}{div}
# The Code
{snippet:id=code|url=openejb3/examples/injection-of-datasource/src/main/java/org/superbiz/injection/MoviesImpl.java|lang=java}
# Writing a unit test for the example
{snippet:id=code|url=openejb3/examples/injection-of-datasource/src/test/java/org/superbiz/injection/MoviesTest.java|lang=java}
Note in the above test code the following lines:
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
As mentioned these actually create and configure the data source. When
OpenEJB boots up, these properties will get read and executed allowing you
to keep all the configuration required to run your tests right in the test
case itself. No need to keep dozens of openejb.xml config files in your
projects or try and create one big configuration that might end up loading
a lot of unneeded containers and resources.
In your production system you can place the properties into the
OPENEJB_HOME/conf/system.properties file or add them to your
OPENEJB_HOME/conf/openejb.xml with a declaration like so:
JdbcDriver = org.hsqldb.jdbcDriver
JdbcUrl = jdbc:hsqldb:mem:moviedb
# Running
Running the example is fairly simple. In the "injection-of-datasource"
directory of the [examples zip](openejb:download.html)
, just run:
> $ mvn clean install
Which should create output like the following.
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.injection.MoviesTest
Apache OpenEJB 3.0 build: 20080408-04:13
http://tomee.apache.org/
INFO - openejb.home =
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource
INFO - openejb.base =
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource
INFO - Configuring Service(id=Default Security Service,
type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager,
type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Configuring Service(id=movieDatabase, type=Resource,
provider-id=Default JDBC Database)
INFO - Configuring Service(id=Default JDK 1.3 ProxyFactory,
type=ProxyFactory, provider-id=Default JDK 1.3 ProxyFactory)
INFO - Found EjbModule in classpath:
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource/target/classes
INFO - Configuring app:
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource/target/classes
INFO - Configuring Service(id=Default Stateful Container, type=Container,
provider-id=Default Stateful Container)
INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL,
id=Default Stateful Container)
INFO - Auto-linking resource-ref
'org.superbiz.injection.MoviesImpl/movieDatabase' in bean Movies to
Resource(id=movieDatabase)
INFO - Loaded Module:
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource/target/classes
INFO - Assembling app:
/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource/target/classes
INFO - Jndi(name=MoviesLocal) --> Ejb(deployment-id=Movies)
INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default
Stateful Container)
INFO - Deployed
Application(path=/Users/dblevins/work/openejb-3.0/examples/injection-of-datasource/target/classes)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.911 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0