第3章 JBoss EAP を使用したアプリケーションの開発
3.1. 概要
本ガイドは、Red Hat JBoss Developer Studio と JBoss EAP 7 クイックスタートを使用してアプリケーションの開発を始めるための情報を提供します。
Red Hat JBoss Developer Studio は、JBoss アプリケーション開発のプラグインを統合する Eclipse ベースの統合開発環境 (IDE) です。JBoss Developer Studio では、JBoss 固有のウィザードやアプリケーションを JBoss EAP サーバーへデプロイする機能を使用してアプリケーション開発を補助します。異なる Java EE 7 技術を使用してアプリケーションの開発を始められるように、JBoss EAP 7 には多くのクイックスタートコードサンプルが含まれています。
3.2. 開発環境の設定
JBoss EAP 7.1 では、JBoss Developer Studio 11.0 以上の使用が推奨されます。
JBoss Developer Studio をダウンロードし、インストールします。
手順については、JBoss Developer Studio『Installation Guide』の「Installing JBoss Developer Studio Stand-alone Using the Installer」を参照してください。
JBoss Developer Studio で JBoss EAP サーバーを設定します。
手順については、『Getting Started with JBoss Developer Studio Tools』の「Using Runtime Detection to Set Up JBoss EAP from within the IDE」を参照してください。
3.3. クイックスタートサンプルの使用
JBoss EAP で提供されるクイックスタートサンプルは Maven プロジェクトです。
3.3.1. Maven
Apache Maven は、ソフトウェアプロジェクトの作成、管理、および構築を行う Java アプリケーションの開発で使用される分散型ビルド自動化ツールです。Maven は Project Object Model (POM) と呼ばれる標準の設定ファイルを利用して、プロジェクトの定義や構築プロセスの管理を行います。POM はモジュールやコンポーネントの依存関係、ビルドの順番、結果となるプロジェクトパッケージングのターゲットを記述し、XML ファイルを使用して出力します。こうすることで、プロジェクトが正しく統一された状態で構築されるようにします。
Maven は、リポジトリーを使用してアーカイブを行います。Maven リポジトリーには Java ライブラリー、プラグイン、およびその他のビルドアーティファクトが格納されています。デフォルトのパブリックリポジトリーは Maven 2 Central Repository ですが、複数の開発チームの間で共通のアーティファクトを共有する目的で、社内のプライベートおよび内部リポジトリーとすることが可能です。また、サードパーティーのリポジトリーも利用できます。詳細は Apache Maven プロジェクトおよび 『Introduction to Repositories』ガイドを参照してください。
JBoss EAP には、Java EE 開発者が JBoss EAP 6 でアプリケーションを構築する際に使用する要件の多くが含まれる Maven リポジトリーが含まれます。
JBoss EAP で Maven を使用する方法の詳細は、JBoss EAP『開発ガイド』の「JBoss EAP で Maven を使用」を参照してください。
3.3.2. クイックスタートでの Maven の使用
アプリケーションをビルドし、JBoss EAP 7 にデプロイするのに必要なアーティファクトと依存関係はパブリックリポジトリーでホストされます。JBoss EAP 7 のクイックスタートでは、Maven settings.xml ファイルを設定して、クイックスタートをビルドするときにこれらのリポジトリーを使用する必要がなくなりました。Maven リポジトリーはクイックスタートプロジェクト POM ファイルに設定されるようになりました。この設定方法は、クイックスタートを容易に使えるようにするために提供されますが、ビルドが遅くなる可能性があるため、通常は本番プロジェクトでの使用は推奨されません。
Red Hat JBoss Developer Studio には Maven が含まれるため、個別にダウンロードおよびインストールする必要はありません。JBoss Developer Studio のバージョン 11.0 以上を使用することが推奨されます。
Maven コマンドラインを使用してアプリケーションをビルドおよびデプロイする場合は、最初に Apache Maven プロジェクトから Maven をダウンロードし、Maven のドキュメントに記載されている手順に従ってインストールします。
3.3.3. クイックスタートのダウンロードおよび実行
3.3.3.1. クイックスタートのダウンロード
JBoss EAP には、さまざまな Java EE 7 の技術を使用してアプリケーションを作成するのに役立つ包括的なクイックスタートコードサンプルが含まれています。クイックスタートは Red Hat カスタマーポータルからダウンロードできます。
- Red Hat カスタマーポータルにログインします。
- ダウンロードをクリックします。
- 製品のダウンロードリストで Red Hat JBoss Enterprise Application Platform をクリックします。
- Version ドロップダウンメニューで 7.1 を選択します。
- 表で Red Hat JBoss Enterprise Application Platform 7.1.0 Quickstarts を見つけ、Download をクリックします。
- ZIP ファイルを希望の場所に保存します。
- Zip ファイルを展開します。
3.3.3.2. JBoss Developer Studio でのクイックスタートの実行
クイックスタートがダウンロードされたら、JBoss Developer Studio にインポートし、JBoss EAP にデプロイできます。
クイックスタートの JBoss Developer Studio へのインポート
各クイックスタートには、プロジェクトおよび設定情報が含まれる POM ファイルが同梱されています。この POM ファイルを使用すると、簡単にクイックスタートを JBoss Developer Studio にインポートできます。
JBoss Developer Studio へのインポート時にクイックスタートプロジェクトフォルダーが IDE ワークスペース内にある場合、IDE は無効なプロジェクト名と WAR アーカイブ名を生成します。作業を開始する前に、クイックスタートプロジェクトフォルダーが IDE ワークスペースの外部にあることを確認してください。
- JBoss Developer Studio を起動します。
- File → Import と選択します。
Maven → Existing Maven Projects と選択し、Next をクリックします。
図3.1 既存の Maven プロジェクトのインポート

希望のクイックスタートのディレクトリー (
helloworldなど) を参照し、OK をクリックします。Projects リストボックスに、選択したクイックスタートプロジェクトのpom.xmlファイルが示されます。図3.2 Maven プロジェクトの選択

- Finish をクリックします。
helloworld クイックスタートの実行
helloworld クイックスタートを実行すると、JBoss EAP サーバーが適切に設定および実行されたことを簡単に検証できます。
- サーバーを定義していない場合は、JBoss EAP サーバーを JBoss Developer Studio に追加します。『Getting Started with JBoss Developer Studio Tools』の「Using Runtime Detection to Set Up JBoss EAP from within the IDE」を参照してください。
Project Explorer タブの helloworld プロジェクトを右クリックし、Run As → Run on Server と選択します。
図3.3 Run As - Run on Server

サーバーリストから JBoss EAP 7.1 サーバーを選択し、Next をクリックします。
図3.4 Run on Server

helloworld クイックスタートはすでにリストされ、サーバーで設定できる状態です。Finish をクリックしてクイックスタートをデプロイします。
図3.5 サーバーで設定されたリソースの変更

結果を検証します。
-
Server タブで、JBoss EAP 7.1 サーバーの状態が
Startedに変わります。 Console タブに、JBoss EAP サーバーの起動と
helloworldクイックスタートのデプロイメントに関するメッセージが表示されます。WFLYUT0021: Registered web context: /helloworld WFLYSRV0010: Deployed "helloworld.war" (runtime-name : "helloworld.war")
-
helloworldアプリケーションは http://localhost:8080/helloworld で使用でき、Hello World!というテキストが表示されます。
-
Server タブで、JBoss EAP 7.1 サーバーの状態が
helloworld クイックスタートの詳細は、「helloworld クイックスタート」を参照してください。
bean-validation クイックスタートの実行
bean-validation などの一部のクイックスタートは、ユーザーインターフェースレイヤーの代わりに Arquillian テストを提供して機能を示します。
-
bean-validationクイックスタートを JBoss Developer Studio にインポートします。 - Servers タブでサーバーを右クリックし、Start を選択して JBoss EAP サーバーを起動します。Servers タブが表示されない場合またはサーバーが未定義の場合は、JBoss EAP サーバーを JBoss Developer Studio に追加します。『Getting Started with JBoss Developer Studio Tools』の「Using Runtime Detection to Set Up JBoss EAP from within the IDE」を参照してください。
-
Project Explorer タブの
bean-validationプロジェクトを右クリックし、Run As → Maven Build と選択します。 以下を Goals 入力フィールドに入力し、Run を実行します。
clean verify -Parq-remote
図3.6 設定の編集

結果を検証します。
Console タブに
bean-validationArquillian テストの結果が表示されます。------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.jboss.as.quickstarts.bean_validation.test.MemberValidationTest Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.189 sec Results : Tests run: 5, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
3.3.3.3. コマンドラインでのクイックスタートの実行
Maven を使用すると、コマンドラインから簡単にクイックスタートをビルドおよびデプロイできます。Maven がインストールされていない場合は Apache Maven プロジェクトを参照し、ダウンロードとインストールを行ってください。
README.md ファイルは、システム要件、Maven の設定、ユーザーの追加、およびクイックスタートの実行に関する一般的な情報が含まれるクイックスタートのルートディレクトリーにあります。
各クイックスタートには、クリックスタートを実行するための特定の手順と Maven コマンドが含まれる独自の README.md ファイルも含まれます。
コマンドラインでの helloworld クイックスタートの実行
-
helloworld クイックスタートのルートディレクトリーにある
README.mdファイルを確認します。 JBoss EAP サーバーを起動します。
$ EAP_HOME/bin/standalone.sh- helloworld クイックスタートディレクトリーへ移動します。
クイックスタートの
README.mdファイルにある Maven コマンドを使用して、クイックスタートをビルドおよびデプロイします。$ mvn clean install wildfly:deploy
-
helloworld アプリケーションは http://localhost:8080/helloworld で使用でき、
Hello World!というテキストが表示されます。
3.4. クイックスタートサンプルの検証
3.4.1. helloworld クイックスタート
helloworld クイックスタートは JBoss EAP に単純なサーブレットをデプロイする方法を示します。ビジネスロジックは CDI (Contexts and Dependency Injection: コンテキストと依存関係の挿入) Bean として提供されるサービスにカプセル化され、サーブレットに挿入されます。このクイックスタートに基づいて、サーバーを適切に設定および起動することができます。
コマンドラインを使用してこのクイックスタートをビルドしデプロイする手順の詳細については、helloworld クイックスタートディレクトリーのルートにある README.html ファイルを参照してください。このトピックでは、Red Hat JBoss Developer Studio を使用してクイックスタートを実行する方法を説明します (Red Hat JBoss Developer Studio がインストールされ、Maven が設定された状態で helloworld クイックスタートがインポートされ、正常に実行されたことを前提とします)。
前提条件
- JBoss Developer Studio をインストールします。手順については、JBoss Developer Studio『Installation Guide』の「Installing JBoss Developer Studio Stand-alone Using the Installer」を参照してください。
-
helloworldクイックスタートを実行します。手順については「JBoss Developer Studio でのクイックスタートの実行」を参照してください。 -
Web ブラウザーを開いて、http://localhost:8080/helloworld でアプリケーションにアクセスし、
helloworldクイックスタートが正常に JBoss EAP にデプロイされたことを確認します。
ディレクトリー構造の確認
helloworld クイックスタートのコードは QUICKSTART_HOME/helloworld/ ディレクトリーにあります。helloworld クイックスタートはサーブレットと CDI Bean によって構成されます。また、バージョン番号が 1.1 であり、bean-discovery-mode が all であるアプリケーションの WEB-INF ディレクトリーに beans.xml ファイルが含まれます。このマーカーファイルにより、WAR が Bean アーカイブとして識別され、JBoss EAP がこのアプリケーションで Bean を検索し、CDI をアクティベートするよう指示されます。
src/main/webapp/ ディレクトリーにクイックスタートのファイルが含まれます。このサンプルのすべての設定ファイルは、src/main/webapp/ 内の WEB-INF/ ディレクトリーにあり、beans.xml ファイルが含まれます。src/main/webapp/ ディレクトリーには index.html ファイルも含まれています。このファイルは簡単なメタリフレッシュ (meta refresh) を使用して、ユーザーのブラウザーを http://localhost:8080/helloworld/HelloWorld にあるサーブレットにリダイレクトします。このクイックスタートには web.xml ファイルは必要ありません。
コードの確認
パッケージの宣言とインポートはこれらのリストには含まれていません。完全なリストはクイックスタートのソースコードにあります。
HelloWorldServletコードを確認します。HelloWorldServlet.javaファイルはsrc/main/java/org/jboss/as/quickstarts/helloworld/ディレクトリーにあります。このサーブレットが情報をブラウザーに送ります。例: HelloWorldServlet クラスコード
42 @SuppressWarnings("serial") 43 @WebServlet("/HelloWorld") 44 public class HelloWorldServlet extends HttpServlet { 45 46 static String PAGE_HEADER = "<html><head><title>helloworld</title></head><body>"; 47 48 static String PAGE_FOOTER = "</body></html>"; 49 50 @Inject 51 HelloService helloService; 52 53 @Override 54 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 55 resp.setContentType("text/html"); 56 PrintWriter writer = resp.getWriter(); 57 writer.println(PAGE_HEADER); 58 writer.println("<h1>" + helloService.createHelloMessage("World") + "</h1>"); 59 writer.println(PAGE_FOOTER); 60 writer.close(); 61 } 62 63 }表3.1 HelloWorldServlet の詳細
行 注記 43
必要な作業は
@WebServletアノテーションを追加し、サーブレットにアクセスするために使用する URL にマッピングを提供するだけです。46〜48
各 Web ページには適切な形式の HTML が必要になります。本クイックスタートは静的な文字列を使用して最低限のヘッダーとフッターの出力を書き出します。
50〜51
これらの行は、実際のメッセージを生成する HelloService CDI Bean を挿入します。HelloService の API を変更しない限り、ビューレイヤーを変更せずに HelloService の実装を後で変更することが可能です。
58
この行はサービスを呼び出し、「Hello World」というメッセージを生成して HTTP 要求へ書き出します。
HelloServiceコードを確認します。HelloService.javaファイルはsrc/main/java/org/jboss/as/quickstarts/helloworld/ディレクトリーにあります。このサービスは単にメッセージを返します。XML やアノテーションの登録は必要ありません。例: HelloService クラスコード
public class HelloService { String createHelloMessage(String name) { return "Hello " + name + "!"; } }
3.4.2. numberguess クイックスタート
numberguess クイックスタートは単純な非永続アプリケーションを作成し、JBoss EAP にデプロイする方法を示します。情報は JSF ビューを使用して表示され、ビジネスロジックは 2 つの CDI Bean にカプセル化されます。numberguess クイックスタートでは 1 から 100 までの数字を当てるチャンスが 10 回与えられます。数字を選択した後、その数字が正解の数字よりも大きいかまたは小さいかが表示されます。
numberguess クイックスタートのコードは QUICKSTART_HOME/numberguess/ ディレクトリーにあります。QUICKSTART_HOME は JBoss EAP のクイックスタートをダウンロードし、展開したディレクトリーです。numberguess クイックスタートは複数の Bean、設定ファイル、および Facelets (JSF) ビューによって構成され、 WAR モジュールとしてパッケージ化されています。
コマンドラインを使用してこのクイックスタートをビルドしデプロイする手順の詳細については、numberguess クイックスタートディレクトリーのルートにある README.html ファイルを参照してください。以下の例では、Red Hat JBoss Developer Studio を使用してクイックスタートを実行します。
前提条件
- JBoss Developer Studio をインストールします。手順については、JBoss Developer Studio『Installation Guide』の「Installing JBoss Developer Studio Stand-alone Using the Installer」を参照してください。
-
numberguessクイックスタートを実行します。手順については、「JBoss Developer Studio でのクイックスタートの実行」を参照し、手順のhelloworldをnumberguessに置き換えてください。 -
Web ブラウザーを開いて http://localhost:8080/numberguess でアプリケーションにアクセスし、
numberguessクイックスタートが正常に JBoss EAP にデプロイされたことを確認します。
設定ファイルの確認
このサンプルのすべての設定ファイルは、クイックスタートの QUICKSTART_HOME/numberguess/src/main/webapp/WEB-INF/ ディレクトリーにあります。
faces-config.xmlファイルを確認します。本クイックスタートは
faces-config.xmlファイル名の JSF 2.2 バージョンを使用します。Facelets の標準的なバージョンが JSF 2.2 のデフォルトのビューハンドラーであるため、設定は必要ありません。このファイルはルート要素のみで構成され、JSF をアプリケーションで有効にする必要があることを示すマーカーファイルにすぎません。<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> </faces-config>beans.xmlファイルを確認します。beans.xmlファイルには、1.1 のバージョン番号とallのbean-discovery-modeが含まれます。このファイルは、WAR を Bean アーカイブとして識別し、JBoss EAP がこのアプリケーションで Bean を検索し、CDI をアクティベートするよう指示するマーカーファイルです。<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all"> </beans>
このクイックスタートは web.xml ファイルを必要としません。
3.4.2.1. JSF コードの確認
JSF はソースファイルに .xhtml ファイル拡張子を使用しますが、レンダリングされたビューは .jsf 拡張子で提供されます。home.xhtml ファイルは src/main/webapp/ ディレクトリーにあります。
例: JSF ソース コード
19<html xmlns="http://www.w3.org/1999/xhtml"
20 xmlns:ui="http://java.sun.com/jsf/facelets"
21 xmlns:h="http://java.sun.com/jsf/html"
22 xmlns:f="http://java.sun.com/jsf/core">
23
24 <head>
25 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
26 <title>Numberguess</title>
27 </head>
28
29 <body>
30 <div id="content">
31 <h1>Guess a number...</h1>
32 <h:form id="numberGuess">
33
34 <!-- Feedback for the user on their guess -->
35 <div style="color: red">
36 <h:messages id="messages" globalOnly="false" />
37 <h:outputText id="Higher" value="Higher!"
38 rendered="#{game.number gt game.guess and game.guess ne 0}" />
39 <h:outputText id="Lower" value="Lower!"
40 rendered="#{game.number lt game.guess and game.guess ne 0}" />
41 </div>
42
43 <!-- Instructions for the user -->
44 <div>
45 I'm thinking of a number between <span
46 id="numberGuess:smallest">#{game.smallest}</span> and <span
47 id="numberGuess:biggest">#{game.biggest}</span>. You have
48 #{game.remainingGuesses} guesses remaining.
49 </div>
50
51 <!-- Input box for the users guess, plus a button to submit, and reset -->
52 <!-- These are bound using EL to our CDI beans -->
53 <div>
54 Your guess:
55 <h:inputText id="inputGuess" value="#{game.guess}"
56 required="true" size="3"
57 disabled="#{game.number eq game.guess}"
58 validator="#{game.validateNumberRange}" />
59 <h:commandButton id="guessButton" value="Guess"
60 action="#{game.check}"
61 disabled="#{game.number eq game.guess}" />
62 </div>
63 <div>
64 <h:commandButton id="restartButton" value="Reset"
65 action="#{game.reset}" immediate="true" />
66 </div>
67 </h:form>
68
69 </div>
70
71 <br style="clear: both" />
72
73 </body>
74</html>
以下の行番号は、JBoss Developer Studio でファイルを表示するときに示されるものに対応します。
表3.2 JSF の詳細
| 行 | 注記 |
|---|---|
|
36〜40 |
これらはユーザーに送信できるメッセージ、「Higher」(より大きい) と「Lower」(より小さい) です。 |
|
45〜48 |
ユーザーが数を選択するごとに数字の範囲が狭まります。有効な数の範囲が分かるようにこの文章は変更されます。 |
|
55〜58 |
この入力フィールドは値式を使用して Bean プロパティーにバインドされます。 |
|
58 |
ユーザーが誤って範囲外の数字を入力しないようにバリデーターのバインディングが使用されます。バリデーターがないと、ユーザーが範囲外の数字を使用する可能性があります。 |
|
59〜61 |
ユーザーの選択した数字をサーバーに送る方法がなければなりません。ここでは、Bean 上のアクションメソッドをバインドします。 |
3.4.2.2. クラスファイルの確認
numberguess クイックスタートのソースファイルはすべて QUICKSTART_HOME/numberguess/src/main/java/org/jboss/as/quickstarts/numberguess/ ディレクトリーにあります。パッケージの宣言とインポートはこれらのリストからは除外されています。完全リストはクイックスタートのソースコードで確認できます。
Random.java修飾子コードの検証修飾子は、型を基にしたインジェクションの対象となる 2 つの bean 間のあいまいさを取り除くために使用されます。修飾子に関する情報は、 JBoss EAP『開発ガイド』の「修飾子を使用したあいまいなインジェクションの解決」を参照してください。
@Random修飾子は乱数のインジェクトに使用されます。@Target({ TYPE, METHOD, PARAMETER, FIELD }) @Retention(RUNTIME) @Documented @Qualifier public @interface Random { }MaxNumber.java修飾子コードの検証@MaxNumberqualifierは最大許可数の挿入に使用されます。@Target({ TYPE, METHOD, PARAMETER, FIELD }) @Retention(RUNTIME) @Documented @Qualifier public @interface MaxNumber { }Generator.javaコードの検証Generatorクラスは、producer メソッドを介して乱数を作成し、producer メソッドを介して最大可能数を公開します。このクラスはアプリケーションスコープであるため、毎回異なる乱数になることはありません。@SuppressWarnings("serial") @ApplicationScoped public class Generator implements Serializable { private java.util.Random random = new java.util.Random(System.currentTimeMillis()); private int maxNumber = 100; java.util.Random getRandom() { return random; } @Produces @Random int next() { // a number between 1 and 100 return getRandom().nextInt(maxNumber - 1) + 1; } @Produces @MaxNumber int getMaxNumber() { return maxNumber; } }Game.javaコードの検証セッションスコープのクラス
Gameは、アプリケーションのプライマリーエントリーポイントであり、ゲームの設定や再設定、ユーザーが選択する数字のキャプチャーや検証、FacesMessageによるユーザーへのフィードバック提供を行います。コンストラクト後の lifecycle メソッドを使用し、@Random Instance<Integer>bean から乱数を取得することによりゲームを初期化します。このクラスの
@Namedアノテーションを見てください。このアノテーションは式言語 (EL) を使用して Bean が JSF ビューにアクセスできるようにしたい場合のみ必要です。この場合#{game}が EL になります。@SuppressWarnings("serial") @Named @SessionScoped public class Game implements Serializable { /** * The number that the user needs to guess */ private int number; /** * The users latest guess */ private int guess; /** * The smallest number guessed so far (so we can track the valid guess range). */ private int smallest; /** * The largest number guessed so far */ private int biggest; /** * The number of guesses remaining */ private int remainingGuesses; /** * The maximum number we should ask them to guess */ @Inject @MaxNumber private int maxNumber; /** * The random number to guess */ @Inject @Random Instance<Integer> randomNumber; public Game() { } public int getNumber() { return number; } public int getGuess() { return guess; } public void setGuess(int guess) { this.guess = guess; } public int getSmallest() { return smallest; } public int getBiggest() { return biggest; } public int getRemainingGuesses() { return remainingGuesses; } /** * Check whether the current guess is correct, and update the biggest/smallest guesses as needed. Give feedback to the user * if they are correct. */ public void check() { if (guess > number) { biggest = guess - 1; } else if (guess < number) { smallest = guess + 1; } else if (guess == number) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!")); } remainingGuesses--; } /** * Reset the game, by putting all values back to their defaults, and getting a new random number. We also call this method * when the user starts playing for the first time using {@linkplain PostConstruct @PostConstruct} to set the initial * values. */ @PostConstruct public void reset() { this.smallest = 0; this.guess = 0; this.remainingGuesses = 10; this.biggest = maxNumber; this.number = randomNumber.get(); } /** * A JSF validation method which checks whether the guess is valid. It might not be valid because there are no guesses left, * or because the guess is not in range. * */ public void validateNumberRange(FacesContext context, UIComponent toValidate, Object value) { if (remainingGuesses <= 0) { FacesMessage message = new FacesMessage("No guesses left!"); context.addMessage(toValidate.getClientId(context), message); ((UIInput) toValidate).setValid(false); return; } int input = (Integer) value; if (input < smallest || input > biggest) { ((UIInput) toValidate).setValid(false); FacesMessage message = new FacesMessage("Invalid guess"); context.addMessage(toValidate.getClientId(context), message); } } }

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.