blob: d5c671d471cf0004c1d2420fe28c2905a2979416 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../favicon.ico">
<link rel="icon" type="image/png" href="../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../css/owl.css">
<link rel="stylesheet" type="text/css" href="../css/animate.css">
<link rel="stylesheet" type="text/css" href="../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../css/idea.css">
<link rel="stylesheet" type="text/css" href="../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../docs.html">Documentation</a></li>
<li><a href="../examples/index.html">Examples</a></li>
<li><a href="../community/index.html">Community</a></li>
<li><a href="../security/index.html">Security</a></li>
<li><a href="../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container section-padded">
<div class="row title">
<div class='page-header'>
<div class='btn-toolbar pull-right' style="z-index: 2000;">
<div class='btn-group'>
<a class="btn" href="../examples/injection-of-env-entry.pdf"><i class="fa fa-file-pdf-o"></i> Download as PDF</a>
</div>
</div>
<h2>Using EnvEntries</h2>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Example injection-of-env-entry can be browsed at <a href="https://github.com/apache/tomee/tree/master/examples/injection-of-env-entry" class="bare">https://github.com/apache/tomee/tree/master/examples/injection-of-env-entry</a></p>
</div>
<div class="paragraph">
<p>The <code>@Resource</code> annotation can be used to inject several things including
DataSources, Topics, Queues, etc. Most of these are container supplied objects.</p>
</div>
<div class="paragraph">
<p>It is possible, however, to supply your own values to be injected via an <code>&lt;env-entry&gt;</code>
in your <code>ejb-jar.xml</code> or <code>web.xml</code> deployment descriptor. Java EE 6 supported <code>&lt;env-entry&gt;</code> types
are limited to the following:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>java.lang.String</p>
</li>
<li>
<p>java.lang.Integer</p>
</li>
<li>
<p>java.lang.Short</p>
</li>
<li>
<p>java.lang.Float</p>
</li>
<li>
<p>java.lang.Double</p>
</li>
<li>
<p>java.lang.Byte</p>
</li>
<li>
<p>java.lang.Character</p>
</li>
<li>
<p>java.lang.Boolean</p>
</li>
<li>
<p>java.lang.Class</p>
</li>
<li>
<p>java.lang.Enum (any enum)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>See also the <a href="../custom-injection">Custom Injection</a> exmaple for a TomEE and OpenEJB feature that will let you
use more than just the above types as well as declare <code>&lt;env-entry&gt;</code> items with a plain properties file.</p>
</div>
</div>
</div>
<h1 id="_using_resource_for_basic_properties" class="sect0">Using @Resource for basic properties</h1>
<div class="paragraph">
<p>The use of the <code>@Resource</code> annotation isn&#8217;t limited to setters. For
example, this annotation could have been used on the corresponding <strong>field</strong>
like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code class="language-java" data-lang="java">@Resource
private int maxLineItems;
A fuller example might look like this:
package org.superbiz.injection.enventry;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import java.util.Date;
@Singleton
public class Configuration {
@Resource
private String color;
@Resource
private Shape shape;
@Resource
private Class strategy;
@Resource(name = "date")
private long date;
public String getColor() {
return color;
}
public Shape getShape() {
return shape;
}
public Class getStrategy() {
return strategy;
}
public Date getDate() {
return new Date(date);
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here we have an <code>@Singleton</code> bean called <code>Confuration</code> that has the following properties (<code>&lt;env-entry&gt;</code> items)</p>
</div>
<div class="ulist">
<ul>
<li>
<p>String color</p>
</li>
<li>
<p>Shape shape</p>
</li>
<li>
<p>Class strategy</p>
</li>
<li>
<p>long date</p>
</li>
</ul>
</div>
<div class="sect1">
<h2 id="_supplying_resource_values_for_env_entry_items_in_ejb_jar_xml">Supplying @Resource values for &lt;env-entry&gt; items in ejb-jar.xml</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The values for our <code>color</code>, <code>shape</code>, <code>strategy</code> and <code>date</code> properties are supplied via <code>&lt;env-entry&gt;</code> elements in the <code>ejb-jar.xml</code> file or the
<code>web.xml</code> file like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code class="language-xml" data-lang="xml">&lt;ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0" metadata-complete="false"&gt;
&lt;enterprise-beans&gt;
&lt;session&gt;
&lt;ejb-name&gt;Configuration&lt;/ejb-name&gt;
&lt;env-entry&gt;
&lt;env-entry-name&gt;org.superbiz.injection.enventry.Configuration/color&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;orange&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
&lt;env-entry&gt;
&lt;env-entry-name&gt;org.superbiz.injection.enventry.Configuration/shape&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;org.superbiz.injection.enventry.Shape&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;TRIANGLE&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
&lt;env-entry&gt;
&lt;env-entry-name&gt;org.superbiz.injection.enventry.Configuration/strategy&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;java.lang.Class&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;org.superbiz.injection.enventry.Widget&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
&lt;env-entry&gt;
&lt;description&gt;The name was explicitly set in the annotation so the classname prefix isn't required&lt;/description&gt;
&lt;env-entry-name&gt;date&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;java.lang.Long&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;123456789&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
&lt;/session&gt;
&lt;/enterprise-beans&gt;
&lt;/ejb-jar&gt;</code></pre>
</div>
</div>
<div class="sect2">
<h3 id="_using_the_resource_name_attribute">Using the @Resource 'name' attribute</h3>
<div class="paragraph">
<p>Note that <code>date</code> was referenced by <code>name</code> as:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code class="language-java" data-lang="java">@Resource(name = "date")
private long date;
When the `@Resource(name)` is used, you do not need to specify the full class name of the bean and can do it briefly like so:
&lt;env-entry&gt;
&lt;description&gt;The name was explicitly set in the annotation so the classname prefix isn't required&lt;/description&gt;
&lt;env-entry-name&gt;date&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;java.lang.Long&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;123456789&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
Conversly, `color` was not referenced by `name`
@Resource
private String color;
When something is not referenced by `name` in the `@Resource` annotation a default name is created. The format is essentially this:
bean.getClass() + "/" + field.getName()
So the default `name` of the above `color` property ends up being `org.superbiz.injection.enventry.Configuration/color`. This is the name
we must use when we attempt to decalre a value for it in xml.
&lt;env-entry&gt;
&lt;env-entry-name&gt;org.superbiz.injection.enventry.Configuration/color&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;orange&lt;/env-entry-value&gt;
&lt;/env-entry&gt;
### @Resource and Enum (Enumerations)
The `shape` field is actually a custom Java Enum type
package org.superbiz.injection.enventry;
public enum Shape {
CIRCLE,
TRIANGLE,
SQUARE
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As of Java EE 6, java.lang.Enum types are allowed as <code>&lt;env-entry&gt;</code> items. Declaring one in xml is done using the actual enum&#8217;s class name like so:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;env-entry&gt;
&lt;env-entry-name&gt;org.superbiz.injection.enventry.Configuration/shape&lt;/env-entry-name&gt;
&lt;env-entry-type&gt;org.superbiz.injection.enventry.Shape&lt;/env-entry-type&gt;
&lt;env-entry-value&gt;TRIANGLE&lt;/env-entry-value&gt;
&lt;/env-entry&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>Do not use <code>&lt;env-entry-type&gt;java.lang.Enum&lt;/env-entry-type&gt;</code> or it will not work!</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configurationtest">ConfigurationTest</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code class="language-java" data-lang="java">package org.superbiz.injection.enventry;
import junit.framework.TestCase;
import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import java.util.Date;
public class ConfigurationTest extends TestCase {
public void test() throws Exception {
final Context context = EJBContainer.createEJBContainer().getContext();
final Configuration configuration = (Configuration) context.lookup("java:global/injection-of-env-entry/Configuration");
assertEquals("orange", configuration.getColor());
assertEquals(Shape.TRIANGLE, configuration.getShape());
assertEquals(Widget.class, configuration.getStrategy());
assertEquals(new Date(123456789), configuration.getDate());
}
}</code></pre>
</div>
</div>
</div>
</div>
<h1 id="_running" class="sect0">Running</h1>
<div class="listingblock">
<div class="content">
<pre class="prettyprint highlight"><code>-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.injection.enventry.ConfigurationTest
Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/injection-of-env-entry
INFO - openejb.base = /Users/dblevins/examples/injection-of-env-entry
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
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 - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-env-entry/target/classes
INFO - Beginning load: /Users/dblevins/examples/injection-of-env-entry/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-env-entry
WARN - Method 'lookup' is not available for 'javax.annotation.Resource'. Probably using an older Runtime.
INFO - Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
INFO - Auto-creating a container for bean Configuration: Container(type=SINGLETON, id=Default Singleton Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.injection.enventry.ConfigurationTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Enterprise application "/Users/dblevins/examples/injection-of-env-entry" loaded.
INFO - Assembling app: /Users/dblevins/examples/injection-of-env-entry
INFO - Jndi(name="java:global/injection-of-env-entry/Configuration!org.superbiz.injection.enventry.Configuration")
INFO - Jndi(name="java:global/injection-of-env-entry/Configuration")
INFO - Jndi(name="java:global/EjbModule1355224018/org.superbiz.injection.enventry.ConfigurationTest!org.superbiz.injection.enventry.ConfigurationTest")
INFO - Jndi(name="java:global/EjbModule1355224018/org.superbiz.injection.enventry.ConfigurationTest")
INFO - Created Ejb(deployment-id=org.superbiz.injection.enventry.ConfigurationTest, ejb-name=org.superbiz.injection.enventry.ConfigurationTest, container=Default Managed Container)
INFO - Created Ejb(deployment-id=Configuration, ejb-name=Configuration, container=Default Singleton Container)
INFO - Started Ejb(deployment-id=org.superbiz.injection.enventry.ConfigurationTest, ejb-name=org.superbiz.injection.enventry.ConfigurationTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=Configuration, ejb-name=Configuration, container=Default Singleton Container)
INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-env-entry)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.664 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0</code></pre>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Apache TomEE the little great server.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://fr-fr.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../documentation.html" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../admin/directory-structure.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../examples.html" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../admin/index.html">Administrators</a>
<li><a hef="../developer/index.html">Developers</a>
<li><a hef="../advanced/index.html">Advanced</a>
<li><a hef="../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../js/jquery-1.11.1.min.js"></script>
<script src="../js/owl.carousel.min.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/wow.min.js"></script>
<script src="../js/typewriter.js"></script>
<script src="../js/jquery.onepagenav.js"></script>
<script src="../js/tree.jquery.js"></script>
<script src="../js/highlight.pack.js"></script>
<script src="../js/main.js"></script>
</body>
</html>