blob: 80f9d77bb072e9a9e279b09c345c9e1d285094d7 [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">
<div class="row"> <div class="col-md-12">
<!-- 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="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Using EnvEntries</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<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> example 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>
<div class="sect1">
<h2 id="_using_resource_for_basic_properties">Using @Resource for basic properties</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The use of the <code>@Resource</code> annotation isn’t limited to setters. For
example, this annotation could have been used on the corresponding
<em>field</em> like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Resource
private int maxLineItems;</code></pre>
</div>
</div>
<div class="paragraph">
<p>A fuller example might look like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.injection.enventry;
import jakarta.annotation.Resource;
import jakarta.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>Configuration</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="sect2">
<h3 id="_supplying_resource_values_for_items_in_ejb_jar_xml">Supplying @Resource values for items in ejb-jar.xml</h3>
<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="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="sect3">
<h4 id="_using_the_resource_name_attribute">Using the @Resource `name' attribute</h4>
<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="highlight"><code class="language-java" data-lang="java">@Resource(name = "date")
private long date;</code></pre>
</div>
</div>
<div class="paragraph">
<p>When the <code>@Resource(name)</code> is used, you do not need to specify the full
class name of the bean and can do it briefly like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> &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;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Conversly, <code>color</code> was not referenced by <code>name</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Resource
private String color;</code></pre>
</div>
</div>
<div class="paragraph">
<p>When something is not referenced by <code>name</code> in the <code>@Resource</code> annotation
a default name is created. The format is essentially this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">bean.getClass() + "/" + field.getName()</code></pre>
</div>
</div>
<div class="paragraph">
<p>So the default <code>name</code> of the above <code>color</code> property ends up being
<code>org.superbiz.injection.enventry.Configuration/color</code>. This is the name
we must use when we attempt to decalre a value for it in xml.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> &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;</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="__resource_and_enum_enumerations">@Resource and Enum (Enumerations)</h4>
<div class="paragraph">
<p>The <code>shape</code> field is actually a custom Java Enum type</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">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’s class name
like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java"> &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;</code></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 class="sect2">
<h3 id="_configurationtest">ConfigurationTest</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.injection.enventry;
import junit.framework.TestCase;
import jakarta.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>
</div>
<div class="sect1">
<h2 id="_running">Running</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">-------------------------------------------------------
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 'jakarta.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 'jakarta.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>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.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="../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/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="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/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>