| Title: Injection of DataSource Example |
| <a name="InjectionofDataSourceExample-Overview"></a> |
| # Overview |
| |
| {span:style=float: right; margin-left: 20px;} |
| {html} |
| |
| <object width="400" height="250"><param name="movie" |
| value="http://www.youtube.com/v/g3lIPlegDJk?fs=1&hl=en_US&rel=0"></param><param |
| name="allowFullScreen" value="true"></param><param name="allowscriptaccess" |
| value="always"></param><embed |
| src="http://www.youtube.com/v/g3lIPlegDJk?fs=1&hl=en_US&rel=0" |
| type="application/x-shockwave-flash" allowscriptaccess="always" |
| allowfullscreen="true" width="400" height="250"></embed></object> |
| |
| {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: |
| |
| |
| <Resource type="DataSource" id="customerDataSource"> |
| .... |
| </Resource> |
| |
| |
| 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} |
| |
| <a name="InjectionofDataSourceExample-TheCode"></a> |
| # The Code |
| |
| {snippet:id=code|url=openejb3/examples/injection-of-datasource/src/main/java/org/superbiz/injection/MoviesImpl.java|lang=java} |
| |
| <a name="InjectionofDataSourceExample-Writingaunittestfortheexample"></a> |
| # 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: |
| |
| |
| <Resource type="DataSource" id="movieDatabase"> |
| JdbcDriver = org.hsqldb.jdbcDriver |
| JdbcUrl = jdbc:hsqldb:mem:moviedb |
| </Resource> |
| |
| |
| <a name="InjectionofDataSourceExample-Running"></a> |
| # 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 |
| |
| |
| |