blob: 6bf6ff8a51097086b8f72cea912f88736c1fee3b [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="Date-Revision-yyyymmdd" content="20140918"/>
<meta http-equiv="Content-Language" content="en"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>CDI Plugin</title>
<link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<link href="/css/syntax.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="/js/community.js"></script>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '41']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<a href="https://github.com/apache/struts" class="github-ribbon">
<img decoding="async" loading="lazy" style="position: absolute; right: 0; border: 0;" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_red_aa0000.png?resize=149%2C149" class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1">
</a>
<header>
<nav>
<div role="navigation" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
Menu
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
</div>
<div id="struts-menu" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Home<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/index.html">Welcome</a></li>
<li><a href="/download.cgi">Download</a></li>
<li><a href="/releases.html">Releases</a></li>
<li><a href="/announce-2024.html">Announcements</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Support<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/mail.html">User Mailing List</a></li>
<li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
<li><a href="/security.html">Reporting Security Issues</a></li>
<li><a href="/commercial-support.html">Commercial Support</a></li>
<li class="divider"></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
<li class="divider"></li>
<li><a href="/maven/project-info.html">Maven Project Info</a></li>
<li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
<li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Documentation<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/birdseye.html">Birds Eye</a></li>
<li><a href="/primer.html">Key Technologies</a></li>
<li><a href="/kickstart.html">Kickstart FAQ</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
<li class="divider"></li>
<li><a href="/getting-started/">Getting Started</a></li>
<li><a href="/security/">Security Guide</a></li>
<li><a href="/core-developers/">Core Developers Guide</a></li>
<li><a href="/tag-developers/">Tag Developers Guide</a></li>
<li><a href="/maven-archetypes/">Maven Archetypes</a></li>
<li><a href="/plugins/">Plugins</a></li>
<li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
<li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
<li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Contributing<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/youatstruts.html">You at Struts</a></li>
<li><a href="/helping.html">How to Help FAQ</a></li>
<li><a href="/dev-mail.html">Development Lists</a></li>
<li class="divider"></li>
<li><a href="/submitting-patches.html">Submitting patches</a></li>
<li><a href="/builds.html">Source Code and Builds</a></li>
<li><a href="/coding-standards.html">Coding standards</a></li>
<li><a href="/contributors/">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/release-guidelines.html">Release Guidelines</a></li>
<li><a href="/bylaws.html">PMC Charter</a></li>
<li><a href="/volunteers.html">Volunteers</a></li>
<li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
<li><a href="/updating-website.html">Updating the website</a></li>
</ul>
</li>
<li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
</ul>
</div>
</div>
</div>
</nav>
</header>
<article class="container">
<section class="col-md-12">
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/cdi/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
<a href="../" title="back to Plugins"><< back to Plugins</a>
<h1 class="no_toc" id="cdi-plugin">CDI Plugin</h1>
<ul id="markdown-toc">
<li><a href="#overview" id="markdown-toc-overview">Overview</a></li>
<li><a href="#setup" id="markdown-toc-setup">Setup</a> <ul>
<li><a href="#maven-setup" id="markdown-toc-maven-setup">Maven Setup</a></li>
<li><a href="#manual-integration" id="markdown-toc-manual-integration">Manual Integration</a></li>
<li><a href="#configuration" id="markdown-toc-configuration">Configuration</a></li>
</ul>
</li>
<li><a href="#usage" id="markdown-toc-usage">Usage</a> <ul>
<li><a href="#example-usage" id="markdown-toc-example-usage">Example Usage</a></li>
</ul>
</li>
</ul>
<h2 id="overview">Overview</h2>
<p>CDI - short for Contexts and Dependency Injection - is the new standard for Java EE (though not limited to it)
dependency injection frameworks. It was introduced as <a href="http://jcp.org/en/jsr/summary?id=299">JSR 299</a>, being
a part of the <a href="http://jcp.org/en/jsr/detail?id=316">Java EE 6</a> umbrella specification. It is also important to note
that it builds on top of JSR 330 (Dependency Injection for Java SE), often referenced as <a href="http://jcp.org/en/jsr/summary?id=330">@Inject</a>.</p>
<p>It can be used as standalone solution packed with your web applications to run in lightweight servlet containers such
as Apache Tomcat or Jetty, utilizing standalone CDI implementations such as <a href="http://seamframework.org/Weld">JBoss Weld</a>
(the JSR 299 reference implementation) or <a href="http://openwebbeans.apache.org/">Apache OpenWebBeans</a>. On the other hand,
each JEE 6 compliant application server such as <a href="http://glassfish.java.net/">Glassfish</a>, <a href="http://www.jboss.org/jbossas">JBoss AS</a>
or <a href="http://openejb.apache.org/apache-tomee">Apache TomEE</a> is required to have a CDI container on board, making it easy
for developers to pack lightweight web or enterprise archives while being able to use a compelling dependency injection
feature set.</p>
<p>With the Struts 2 CDI plugin, your application is open to be embedded into this modern, comprehensive and type safe
framework and take full use of it.</p>
<h2 id="setup">Setup</h2>
<p>As with all Struts 2 plugins, usage of the CDI plugin is as easy as delivering the right jars with your web application.
The plugin then registers itself as the standard ObjectFactory for your Struts 2 application.</p>
<blockquote>
<p>Don’t mess up Object Factory Providers</p>
</blockquote>
<p>Struts 2 delivers integration into all relevant dependency injection containers via plugins, such as the <a href="../spring">Spring Plugin</a>
or the externally provided <a href="http://code.google.com/p/google-guice/wiki/Struts2Integration">Guice Struts 2 Plugin</a>.
Be aware that the central feature of all those, as well as the CDI plugin, is to register itself as Struts 2 Object
factory. Usually you will want to use <strong>exactly one of those plugins</strong> in your application, since there will only
be <strong>one ObjectFactory</strong> implementation for Struts 2 to chose. If you pack more than one of those plugins, the factory
to be chosen will be undetermined. One will win in the end, but who knows which …</p>
<h3 id="maven-setup">Maven Setup</h3>
<p>The most easy and recommended way use is to simply add a maven dependency for it, along with a dependency to the CDI API
for development time usage:</p>
<p><strong>pom.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;dependencies&gt;</span>
...
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>struts2-cdi-plugin<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>${struts2.version}<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>javax.enterprise<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>cdi-api<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>1.0-SP1<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
...
<span class="nt">&lt;/dependencies&gt;</span>
</code></pre></div></div>
<p>whereas <code class="language-plaintext highlighter-rouge">${struts2.version}</code> should be set either as a property in your pom (recommended) or substituted by a concrete
version information, such as 2.3.2 by the time of writing of this document. If you want to use CDI without an application
server providing it, you may also want to add a dependency to a CDI implementation of your choice, for example Weld:</p>
<p><strong>pom.xml with CDI implementation</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;dependencies&gt;</span>
...
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>struts2-cdi-plugin<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>${struts2.version}<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>javax.enterprise<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>cdi-api<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>1.0-SP1<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.jboss.weld<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>weld-core<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>1.0.1-Final<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
<span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.jboss.weld<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>weld-se<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>1.0.1-Final<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
...
<span class="nt">&lt;/dependencies&gt;</span>
</code></pre></div></div>
<h3 id="manual-integration">Manual Integration</h3>
<p>Ensure that the struts2-cdi-plugin jar matching your used Struts 2 framework version - it is part of the <a href="../download.cgi">Struts 2 distribution</a> -
is packed within the application archive that will be delivered. If a CDI implementation is provided within your container,
no other dependencies are needed. If the latter is not the case, you may want to install a CDI container into your container
(as commmon installation or packed with your app) according to the installation instructions of the CDI provider of choice.</p>
<p>For IDE integration, be sure to add both the struts2-cdi-plugin-VERSION.jar as well as the cdi-api.jar to your project setup.
Remember, the API jar should not be delivered with your application archive since you will have the API provided
by the CDI container your application will be running with.</p>
<h3 id="configuration">Configuration</h3>
<p>Not much to see here. The CDI specification requires the CDI container to be exposed via JNDI context, and the CDI plugin
will pick it up just there. Nevertheless, since there are different JNDI namespaces in use, the plugin will try
to automatically find the right one among known references, that is</p>
<ul>
<li>
<p>java:comp/BeanManager as the CDI docs point out</p>
</li>
<li>
<p>java:app/BeanManager as the Weld docs point out</p>
</li>
<li>
<p>java:comp/env/BeanManager for containers limited to that namespace, such as tomcat</p>
</li>
</ul>
<p>If your container of choice uses other naming references, the plugin has a single configuration option to point to
the right name. Just add a constant like this to your struts.xml to be on the happy path again:</p>
<p><strong>struts.xml</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.objectFactory.cdi.jndiKey"</span> <span class="na">value=</span><span class="s">"java:comp/some/weird/BeanManagerReference"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>
<h2 id="usage">Usage</h2>
<p>CDI has an extremely rich feature set, and this section is not intended as a replacement for the CDI reference
documentation or the excellent documentation found on the <a href="http://seamframework.org/Weld">JBoss Weld</a> homepage.
The whole Struts 2 CDI integration works just as you would think it works, using JSR-299 and JSR-330 Annotations
in your Struts 2 actions or interceptors. Be aware of the following, though:</p>
<blockquote>
<p>Remember to provide beans.xml</p>
</blockquote>
<p>CDI is designed to act in a type safe and modern way, thus using annotations for all aspects of the framework.
Nevertheless, you are allowed to eternalize configuration into a XML file called beans.xml to be placed in your WEB-INF
directory. Even if you don’t intend to use such external configuration, it is an <strong>inevitable requirement to provide at least an empty beans.xml in WEB-INF !</strong></p>
<h3 id="example-usage">Example Usage</h3>
<p>Implement your Struts 2 actions or interceptors just as usual, enriched with CDI and @Inject annotations:</p>
<p><strong>NumberGuess.java</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kn">package</span> <span class="nn">org.apache.struts2.example.cdi</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.opensymphony.xwork2.ActionSupport</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.inject.Inject</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">NumberGuess</span> <span class="kd">extends</span> <span class="nc">ActionSupport</span> <span class="o">{</span>
<span class="nd">@Inject</span>
<span class="nc">Game</span> <span class="n">game</span><span class="o">;</span>
<span class="kd">public</span> <span class="nc">Game</span> <span class="nf">getGame</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">game</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="k">return</span> <span class="no">SUCCESS</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">guess</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="kd">final</span> <span class="nc">String</span> <span class="n">errorMessage</span> <span class="o">=</span> <span class="n">game</span><span class="o">.</span><span class="na">check</span><span class="o">();</span>
<span class="n">addActionError</span><span class="o">(</span><span class="n">errorMessage</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="nc">Game</span><span class="o">.</span><span class="na">CORRECT</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">errorMessage</span><span class="o">))</span> <span class="o">{</span>
<span class="n">game</span><span class="o">.</span><span class="na">reset</span><span class="o">();</span>
<span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">game</span><span class="o">.</span><span class="na">getRemainingGuesses</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="n">addActionError</span><span class="o">(</span><span class="s">"The correct guess was "</span> <span class="o">+</span> <span class="n">game</span><span class="o">.</span><span class="na">getGuess</span><span class="o">()</span> <span class="o">+</span> <span class="s">". Game is reset."</span><span class="o">);</span>
<span class="n">game</span><span class="o">.</span><span class="na">reset</span><span class="o">();</span>
<span class="o">}</span>
<span class="k">return</span> <span class="no">SUCCESS</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>See the @Inject annotation from javax.inject.Inject? While you could use all the other nice stuff, we usually would -
following the separation of concerns principle - use @Inject most of the time only in our actions, keeping the more
fancy stuff in the business layer as shown below. Using @Inject brings us to the most common pitfall when using
Struts 2 together with JSR-330 / CDI:</p>
<blockquote>
<p>Use the right @Inject</p>
</blockquote>
<p>Struts 2 and it’s core component XWork use it’s own internal dependency injection container. Interestingly, you could
name it JSR-330’s grandma, since it is an early pre-release version of <a href="http://code.google.com/p/google-guice/">Google Guice</a>
once developed by <a href="http://blog.crazybob.org/">Crazybob Lee</a> - the same Bob Lee that, together with SpringSource’s Rod Johnson,
lead the JSR-330 specification.</p>
<p>That said, you will find the @Inject annotation both as com.opensymphony.xwork2.inject.Inject and javax.inject.Inject.
<strong>Don’t mix up those two - javax.inject.Inject is the one you want to use with your Struts 2 CDI plugin and CDI
integration in general!</strong> While you could use Struts’ internal annotation as well, the effect may be strange
to undefined - so check your imports!</p>
<p>Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour.
Add a JSP view similar to this:</p>
<div class="language-jsp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;%@ page </span><span class="na">contentType=</span><span class="s">"text/html; charset=UTF-8"</span> <span class="nt">%&gt;</span>
<span class="nt">&lt;%@ taglib </span><span class="na">prefix=</span><span class="s">"s"</span><span class="na"> uri=</span><span class="s">"/struts-tags"</span> <span class="nt">%&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
<span class="nt">&lt;title&gt;</span>Numberguess<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;h2&gt;</span>Numberguess Game - Struts 2 CDI Example<span class="nt">&lt;/h2&gt;</span>
<span class="nt">&lt;h3&gt;</span>I've picked a number between <span class="nt">&lt;s:property </span><span class="na">value=</span><span class="s">"game.smallest"</span><span class="nt">/&gt;</span> and <span class="nt">&lt;s:property </span><span class="na">value=</span><span class="s">"game.biggest"</span><span class="nt">/&gt;</span>.
You have <span class="nt">&lt;s:property </span><span class="na">value=</span><span class="s">"game.remainingGuesses"</span><span class="nt">/&gt;</span>remaining guesses.<span class="nt">&lt;/h3&gt;</span>
<span class="nt">&lt;s:form </span><span class="na">action=</span><span class="s">"guess"</span><span class="nt">&gt;</span>
<span class="nt">&lt;s:textfield </span><span class="na">name=</span><span class="s">"game.guess"</span><span class="na"> label=</span><span class="s">"Your Guess"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;s:submit/&gt;</span>
<span class="nt">&lt;/s:form&gt;</span>
<span class="nt">&lt;p/&gt;</span>
<span class="nt">&lt;s:actionerror/&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<p>along - if not using the fabulous and recommended Struts 2 <a href="../convention">Convention Plugin</a> - with a struts.xml like this</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="cp">&lt;!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"&gt;</span>
<span class="nt">&lt;struts&gt;</span>
<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.enable.DynamicMethodInvocation"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.devMode"</span> <span class="na">value=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"numberguess"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"NumberGuess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"guess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span> <span class="na">method=</span><span class="s">"guess"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;/package&gt;</span>
<span class="nt">&lt;/struts&gt;</span>
</code></pre></div></div>
<p>Now you can add the business logic we want to be managed and injected by CDI. Start with two qualifier annotations:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="nn">org.apache.struts2.example.cdi</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.inject.Qualifier</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Documented</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">ElementType</span><span class="o">.*;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Retention</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Target</span><span class="o">;</span>
<span class="nd">@Target</span><span class="o">(</span> <span class="o">{</span> <span class="no">TYPE</span><span class="o">,</span> <span class="no">METHOD</span><span class="o">,</span> <span class="no">PARAMETER</span><span class="o">,</span> <span class="no">FIELD</span> <span class="o">})</span>
<span class="nd">@Retention</span><span class="o">(</span><span class="no">RUNTIME</span><span class="o">)</span>
<span class="nd">@Documented</span>
<span class="nd">@Qualifier</span>
<span class="kd">public</span> <span class="nd">@interface</span> <span class="nc">Random</span> <span class="o">{}</span>
</code></pre></div></div>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="nn">org.apache.struts2.example.cdi</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.inject.Qualifier</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Documented</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">ElementType</span><span class="o">.*;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Retention</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.lang.annotation.Target</span><span class="o">;</span>
<span class="nd">@Target</span><span class="o">(</span> <span class="o">{</span> <span class="no">TYPE</span><span class="o">,</span> <span class="no">METHOD</span><span class="o">,</span> <span class="no">PARAMETER</span><span class="o">,</span> <span class="no">FIELD</span> <span class="o">})</span>
<span class="nd">@Retention</span><span class="o">(</span><span class="no">RUNTIME</span><span class="o">)</span>
<span class="nd">@Documented</span>
<span class="nd">@Qualifier</span>
<span class="kd">public</span> <span class="nd">@interface</span> <span class="nc">MaxNumber</span> <span class="o">{}</span>
</code></pre></div></div>
<p>Now on to the actual business beans, the Game and the Generator bean:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="nn">org.apache.struts2.example.cdi</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.annotation.PostConstruct</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.enterprise.context.SessionScoped</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.enterprise.inject.Instance</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.inject.Inject</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.inject.Named</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.Serializable</span><span class="o">;</span>
<span class="nd">@Named</span>
<span class="nd">@SessionScoped</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Game</span> <span class="kd">implements</span> <span class="nc">Serializable</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">String</span> <span class="no">CORRECT</span> <span class="o">=</span> <span class="s">"Correct !!!"</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">String</span> <span class="no">WRONG</span> <span class="o">=</span> <span class="s">"Sorry, wrong number !!!"</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">number</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">guess</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">smallest</span><span class="o">;</span>
<span class="nd">@MaxNumber</span>
<span class="nd">@Inject</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">maxNumber</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">biggest</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">remainingGuesses</span><span class="o">;</span>
<span class="nd">@Random</span>
<span class="nd">@Inject</span>
<span class="nc">Instance</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">randomNumber</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Game</span><span class="o">()</span> <span class="o">{</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getNumber</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">number</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getGuess</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">guess</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setGuess</span><span class="o">(</span> <span class="kt">int</span> <span class="n">guess</span> <span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">guess</span> <span class="o">=</span> <span class="n">guess</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getSmallest</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">smallest</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getBiggest</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">biggest</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getRemainingGuesses</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">remainingGuesses</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">check</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">InterruptedException</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">&gt;</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
<span class="n">biggest</span> <span class="o">=</span> <span class="n">guess</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">&lt;</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
<span class="n">smallest</span> <span class="o">=</span> <span class="n">guess</span> <span class="o">+</span> <span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">==</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="no">CORRECT</span><span class="o">;</span>
<span class="o">}</span>
<span class="n">remainingGuesses</span><span class="o">--;</span>
<span class="k">return</span> <span class="no">WRONG</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@PostConstruct</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">reset</span><span class="o">()</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">smallest</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">guess</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">remainingGuesses</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">biggest</span> <span class="o">=</span> <span class="n">maxNumber</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">number</span> <span class="o">=</span> <span class="n">randomNumber</span><span class="o">.</span><span class="na">get</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kn">package</span> <span class="nn">org.apache.struts2.example.cdi</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.enterprise.context.ApplicationScoped</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.enterprise.inject.Produces</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.Serializable</span><span class="o">;</span>
<span class="nd">@ApplicationScoped</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Generator</span> <span class="kd">implements</span> <span class="nc">Serializable</span> <span class="o">{</span>
<span class="kd">private</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span> <span class="n">random</span> <span class="o">=</span> <span class="k">new</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span><span class="o">(</span> <span class="nc">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">()</span> <span class="o">);</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">maxNumber</span> <span class="o">=</span> <span class="mi">100</span><span class="o">;</span>
<span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span> <span class="nf">getRandom</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">random</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Produces</span> <span class="nd">@Random</span> <span class="kt">int</span> <span class="nf">next</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="nf">getRandom</span><span class="o">().</span><span class="na">nextInt</span><span class="o">(</span><span class="n">maxNumber</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Produces</span> <span class="nd">@MaxNumber</span> <span class="kt">int</span> <span class="nf">getMaxNumber</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">maxNumber</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural
language oriented way the CDI stack works. If neither of this is the case, now it’s time to check the CDI and Weld
documentation. Remember, this is a trivial example - there is much more to know about CDI.</p>
<p>Ready you are now - use the Force!</p>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation. All Rights Reserved.
</div>
<div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
</footer>
<script>!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = "//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");</script>
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
<div id="fb-root"></div>
<script>(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>