| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <head> |
| <title>Applying @Alternative Beans and Lifecycle Annotations - IDE NetBeans Tutorial</title> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <meta name="description" content="This tutorial explores CDI's injection facilities to perform custom validation using NetBeans IDE"> |
| <meta name="keywords" content="NetBeans, IDE, integrated development environment, |
| Contexts and Dependency Injection, CDI, Web Beans, injection, qualifier"> |
| |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| </head> |
| <body> |
| |
| <!-- |
| Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <h1>Применение аннотации @Alternative и аннотаций жизненного цикла</h1> |
| |
| <p><em>Предоставлено Энди Гибсоном (Andy Gibson)</em></p> |
| |
| <div class="margin-around"> |
| <div class="feedback-box margin-around float-left" style="margin-right:15px"> |
| |
| <h3>Внедрение контекстов и зависимостей</h3> |
| |
| <ol> |
| <li><a href="cdi-intro.html">Введение в CDI и JSF 2.0</a></li> |
| <li><a href="cdi-inject.html">Работа с внедрением и квалификаторами в CDI</a></li> |
| <li><strong>Применение аннотации @Alternative и аннотаций жизненного цикла</strong> |
| |
| <ul style="margin: 5px 0 0 -2em"> |
| <li><a href="#alternative">Обработка нескольких развертываний</a></li> |
| <li><a href="#lifecycle">Применение аннотаций жизненного цикла к управляемым компонентам</a></li> |
| <li><a href="#seealso">Дополнительные сведения</a></li> |
| </ul></li> |
| |
| <li><a href="cdi-events.html">Обработка событий в CDI</a></li> |
| </ol> |
| </div> |
| </div> |
| |
| <img alt="Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"> |
| |
| <p>Внедрение контекстов и зависимостей (CDI), определяемое документом <a href="http://jcp.org/en/jsr/detail?id=299">JSR-299</a>, является неотъемлемой частью Java EE 6 и обеспечивает архитектуру, позволяющую компонентам Java EE (например, сервлетам, компонентам EJB и JavaBeans) существовать в жизненном цикле приложения с четко определенными контекстами. Кроме того, службы CDI позволяют компонентам Java EE (например, компонентам сеансов EJB и управляемым компонентам JavaServer Faces) внедряться и свободно взаимодействовать путем запуска и обработки событий.</p> |
| |
| <p>Этот учебный курс основан на записи блога Энди Гибсона (Andy Gibson) <a href="http://www.andygibson.net/blog/index.php/2009/12/22/getting-started-with-cdi-part-2-injection/">Начало работы с CDI. Часть 2. Внедрение</a>. В нем рассматривается использование аннотации <code>@Alternative</code> для настройки приложения для различных развертываний, а также показано, как использовать аннотации жизненного цикла управляемых компонентов, например, <code>@PostConstruct</code> и <code>@PreDestroy</code> для совмещения внедрения CDI с функциональными возможностями <a href="http://jcp.org/en/jsr/detail?id=316">спецификации управляемых компонентов Java EE 6</a></p> |
| |
| <p>В NetBeans IDE обеспечена встроенная поддержка для внедрения контекстов и зависимостей, включая поддержку создания файла конфигурации CDI <code>beans.xml</code> при создании проекта, поддержку редактора и навигации для аннотаций, а также различных мастеров для создания часто используемых артефактов CD.</p> |
| |
| <br style="clear:left;"> |
| |
| <div class="indent"> |
| <p>Для работы с этим учебным курсом требуется программное обеспечение и материалы, перечисленные ниже.</p> |
| |
| <table id="requiredSoftware"> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Программное обеспечение или материал</th> |
| <th class="tblheader" scope="col">Требуемая версия</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">IDE NetBeans</a></td> |
| <td class="tbltd1">Версия 7.2, 7.3, 7.4, 8.0, Java EE</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Комплект для разработчика на языке Java (JDK)</a></td> |
| <td class="tbltd1">версия 7 или 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://glassfish.dev.java.net/">Сервер GlassFish</a></td> |
| <td class="tbltd1">Open Source Edition 3.x или 4.x</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FcdiDemo2.zip">cdiDemo2.zip</a></td> |
| <td class="tbltd1">неприменимо</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p class="notes"><strong>Примечания</strong></p> |
| </div> |
| |
| <ul> |
| <li>В комплект Java для IDE NetBeans также входит компонент GlassFish Server Open Source Edition, являющийся контейнером, совместимым с Java EE.</li> |
| |
| <li>Пример проекта к этому учебному курсу можно загрузить здесь: <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FcdiDemo3.zip">cdiDemo3.zip</a></li> |
| </ul> |
| |
| |
| <br> |
| <h2 id="alternative">Обработка нескольких развертываний</h2> |
| |
| <p>CDI предлагает использовать аннотацию <code>@Alternative</code>, которая позволяет пакетировать несколько компонентов, соответствующих одной точке внедрения, без неоднозначностей. Другими словами, аннотация <code>@Alternative</code> может применяться к двум или нескольким компонентам, а затем, в зависимости от развертывания, в файле настройки CDI <code>beans.xml</code> указывается компонент для использования.</p> |
| |
| <p>Для наглядности рассмотрим следующий случай. <code>ItemValidator</code> добавляется в главный класс <code>ItemProcessor</code>. <code>ItemValidator</code> имеет две реализации: <code>DefaultItemValidator</code> и <code>RelaxedItemValidator</code>. В соответствие с требованиями к развертыванию в большинстве случаев требуется использовать <code>DefaultItemValidator</code>, а <code>RelaxedItemValidator</code> — в одном конкретном развертывании. Для этого создаются аннотации к каждому компоненту, а затем указывается компонент, который используется для данного развертывания путем добавления записей в файл приложения <code>beans.xml</code> .</p> |
| |
| <div class="indent"> |
| <img alt="На диаграмме CDI отображаются объекты, созданные в этом упражнении" class="margin-around" src="../../../images_www/articles/73/javaee/cdi-validate/cdi-diagram-alternative.png" title="Используйте внедрение CDI для свободного взаимодействия классов в используемом приложении"> |
| </div> |
| |
| <ol> |
| <li>Начните работу с извлечения начального проекта из файла <code>cdiDemo2.zip</code> (см. выше <a href="#requiredSoftware">таблицу необходимых ресурсов</a>). Выберите File ("Файл") > Open Project ("Открыть проект") (Ctrl-Shift-O), затем выберите проект в его местоположении на компьютере.</li> |
| <li>Щелкните правой кнопкой мыши узел проекта в окне "Проекты" и выберите команду "Свойства".</li> |
| <li>Выберите категорию "Запуск" и убедитесь, что в списке "Сервер" выбран экземпляр GlassFish. </li> |
| |
| <li>Создайте интерфейс <code>ItemValidator</code>. <br><br> Щелкните 'Создать файл' ( <img alt="Кнопка 'Создать файл'" src="../../../images_www/articles/73/javaee/cdi-common/new-file-btn.png"> ) или нажмите сочетание клавиш CTRL+N (⌘-N on Mac) для открытия мастера создания файлов. </li> |
| |
| <li>Выберите категорию Java, а затем команду "Интерфейс Java". Нажмите кнопку "Далее".</li> |
| |
| <li>Введите имя класса в <strong>ItemValidator</strong> и пакет <strong>exercise3</strong>.</li> |
| |
| <li>Нажмите кнопку "Завершить". Интерфейс будет создан и открыт в редакторе.</li> |
| |
| <li>Добавьте метод <code>isValid()</code>, который принимает в качестве параметра объект <code>Item</code> и возвращает логическое значение <code>boolean</code>. |
| |
| <pre class="examplecode"> |
| public interface ItemValidator { |
| <strong>boolean isValid(Item item);</strong> |
| }</pre> |
| С помощью подсказки редактора добавьте оператор импорта для <code>exercise2.Item</code>.</li> |
| |
| <li>Расширьте класс <code>ItemProcessor</code> для добавления новой возможности. Откройте в редакторе <code>ItemProcessor</code> и внесите следующие изменения. |
| |
| |
| <pre class="examplecode"> |
| @Named |
| @RequestScoped |
| public class ItemProcessor { |
| |
| @Inject @Demo |
| private ItemDao itemDao; |
| |
| <strong>@Inject |
| private ItemValidator itemValidator;</strong> |
| |
| public void execute() { |
| List<Item> items = itemDao.fetchItems(); |
| for (Item item : items) { |
| System.out.println(<strong>"Item = " + item + " valid = " + itemValidator.isValid(item)</strong>); |
| } |
| } |
| }</pre> |
| <p class="tips">С помощью подсказки редактора добавьте оператор импорта для <code>exercise3.ItemValidator</code>.</p></li> |
| |
| <li>Создайте реализацию <code>ItemValidator</code> под названием <code>DefaultItemValidator</code>, которая просто сравнивает значение с предельным. |
| |
| <p> |
| В окне "Проекты" щелкните правой кнопкой пакет <code>exercise3</code> и выберите команду "Создать" > "Класс Java". Дайте классу имя <strong>DefaultItemValidator</strong> и нажмите кнопку "Готово".</p></li> |
| |
| <li>В элементе <code>DefaultItemValidator</code> реализуйте <code>ItemValidator</code> и переопределите метод <code>isValid()</code> следующим образом. |
| |
| <pre class="examplecode"> |
| public class DefaultItemValidator <strong>implements ItemValidator</strong> { |
| |
| <strong>@Override |
| public boolean isValid(Item item) { |
| return item.getValue() < item.getLimit(); |
| }</strong> |
| }</pre> |
| |
| <p>С помощью подсказки редактора добавьте оператор импорта для <code>exercise2.Item</code>.</p></li> |
| |
| |
| <li>Нажмите кнопку 'Запустить проект' (<img alt="Кнопка 'Выполнить проект'" src="../../../images_www/articles/73/javaee/cdi-common/run-project-btn.png">) на главной панели инструментов IDE. Файл скомпилирован и развернут в GlassFish, и страница приветствия приложения (<code>process.xhtml</code>) отображается в веб-браузере.</li> |
| |
| <li>Нажмите кнопку <code>Выполнить</code> на странице. Вернитесь в среду IDE и проверьте протокол сервера GlassFish. Журнал сервера отображается в окне вывода (Ctrl-4; ⌘-4 в Mac) на вкладке 'GlassFish'. В нем видно, что элементы проверяются и перечисляются только допустимые элементы, значение которых меньше предельного. |
| |
| <pre class="examplecode"> |
| INFO: Item = exercise2.Item@e857ac [Value=34, Limit=7] valid = false |
| INFO: Item = exercise2.Item@63124f52 [Value=4, Limit=37] valid = true |
| INFO: Item = exercise2.Item@4715c34e [Value=24, Limit=19] valid = false |
| INFO: Item = exercise2.Item@65c95a57 [Value=89, Limit=32] valid = false</pre> |
| |
| <img alt="Окно вывода - журнал сервера GlassFish" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-validate/output-window.png" title="Просмотрите журнал сервера в окне вывода"></li> |
| |
| <li>Теперь рассмотрим случай, в котором вам необходимо выполнить развертывание в другом месте, менее жестком, считающим компонент недопустимым только в том случае, если его значение более чем в два раза превышает ограничение. Может потребоваться другой компонент для реализации интерфейса <code>ItemValidator</code> для данной логики. |
| |
| <p> |
| Создайте новую реализацию <code>ItemValidator</code> с именем <code>RelaxedItemValidator</code>. В окне "Проекты" щелкните правой кнопкой пакет <code>exercise3</code> и выберите команду "Создать" > "Класс Java". Дайте классу имя <strong>RelaxedItemValidator</strong> и нажмите кнопку "Готово".</p></li> |
| |
| <li>Сделайте <code>RelaxedItemValidator</code> реализацией <code>ItemValidator</code> и переопределите метод <code>isValid()</code> следующим образом. |
| |
| <pre class="examplecode"> |
| public class RelaxedItemValidator <strong>implements ItemValidator</strong> { |
| |
| <strong>@Override |
| public boolean isValid(Item item) { |
| return item.getValue() < (item.getLimit() * 2); |
| }</strong> |
| }</pre> |
| |
| <p>С помощью подсказки редактора добавьте оператор импорта для <code>exercise2.Item</code>.</p></li> |
| |
| |
| <li>Для запуска проекта нажмите кнопку 'Запустить проект' ( <img alt="Кнопка 'Выполнить проект'" src="../../../images_www/articles/73/javaee/cdi-common/run-project-btn.png"> ). Обратите внимание, что теперь развертывание проекта завершается сбоем.</li> |
| |
| <li>Проверьте журнал сервера в окне вывода (Ctrl-4; ⌘-4 в Mac). В протоколе отображается сообщение об ошибке неоднозначной зависимости. Это происходит по причине того, что имеются два класса, реализующих один и тот же интерфейс. |
| |
| <pre class="examplecode"> |
| org.glassfish.deployment.common.DeploymentException: Injection point has ambiguous dependencies. |
| Injection point: field exercise2.ItemProcessor.itemValidator; |
| Qualifiers: [@javax.enterprise.inject.Default()]; |
| Possible dependencies: [exercise3.RelaxedItemValidator, exercise3.DefaultItemValidator]</pre> |
| |
| <p>Реализация Weld CDI не способна определить элемент, используемый для данной точки внедрения (<code>RelaxedItemValidator</code> или <code>DefaultItemValidator</code>).</p> |
| |
| <p> |
| Как указано выше, единственное отличие связано с развертыванием. Для большинства развертываний можно использовать средство проверки по умолчанию, однако для одного развертывания может потребоваться использование "нежесткой" реализации. В CDI существует аннотация <code>@Alternative</code>, которая позволяет пакетировать несколько компонентов, соответствующих одной точке внедрения, без проблем неоднозначности, поскольку при этом используется компонент, указанный в файле <code>beans.xml</code> . Это позволяет развертывать в одном модуле обе реализации. При этом отличается только определение в файле <code>beans.xml</code> , которое уникально для каждой реализации.</p></li> |
| |
| <li>Добавьте аннотацию <code>@Alternative</code> и соответствующий оператор импорта в <code>RelaxedItemValidator</code> и <code>DefaultItemValidator</code>. <br><br> Откройте в редакторе <code>RelaxedItemValidator</code> и внесите следующие изменения. |
| |
| <pre class="examplecode"> |
| <strong>import javax.enterprise.inject.Alternative;</strong> |
| ... |
| |
| <strong>@Alternative</strong> |
| public class RelaxedItemValidator implements ItemValidator { |
| |
| public boolean isValid(Item item) { |
| return item.getValue() < (item.getLimit() * 2); |
| } |
| }</pre> |
| <p class="tips">Введите '<code>@Al</code>', затем нажмите CTRL+ПРОБЕЛ для вызова автозавершения кода. Поскольку возможен только один вариант, аннотация <code>@Alternative</code> завершается, а в начале файла автоматически добавляется соответствующий оператор импорта для <code>javax.enterprise.inject.Alternative</code>. Как правило, при нажатии CTRL+ПРОБЕЛ в аннотациях также вызывается всплывающая документация Javadoc.</p> |
| |
| |
| <img alt="Всплывающее окно документации Javadoc в редакторе" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-validate/code-completion-alternative.png" title="Нажмите Ctrl-Space в аннотациях для вызова документации Javadoc"> |
| |
| <p> |
| Переключитесь к <code>DefaultItemValidator</code> (нажмите сочетание клавиш CTRL+TAB) и внесите следующее изменение.</p> |
| |
| <pre class="examplecode"> |
| <strong>import javax.enterprise.inject.Alternative;</strong> |
| ... |
| |
| <strong>@Alternative</strong> |
| public class DefaultItemValidator implements ItemValidator { |
| |
| public boolean isValid(Item item) { |
| return item.getValue() < item.getLimit(); |
| } |
| }</pre> |
| |
| <p>Выполняя развертывание приложения сейчас, вы получите ошибку "неудовлетворенная зависимость", так как два подходящих компонента были определены как альтернативные, но ни один из них не был активирован в файле <code>beans.xml</code> .</p></li> |
| |
| <li>С помощью диалогового окна "Переход к файлу" в среде IDE откройте файл <code>beans.xml</code> . Выберите пункт "Переход" > "Переход к файлу" в главном меню среды IDE (сочетание клавиш ALT+SHIFT+O; CTRL+SHIFT+O в Mac OS), затем введите <code>beans</code>. Нажмите кнопку "ОК". <img alt="Диалоговое окно 'Перейти к файлу'" class="margin-around b-all" src="../../../images_www/articles/73/javaee/cdi-validate/go-to-file.png" title="С помощью диалогового окна &quot;Переход к файлу&quot; быстро найдите файл проекта."></li> |
| |
| <li>Внесите следующие изменения в файл <code>beans.xml</code> |
| |
| <pre class="examplecode"> |
| <beans xmlns="http://java.sun.com/xml/ns/javaee" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> |
| |
| <strong><alternatives> |
| <class>exercise3.RelaxedItemValidator</class> |
| </alternatives></strong> |
| |
| </beans></pre> |
| |
| <p>Данная команда указывает CDI использовать <code>RelaxedItemValidator</code> для данного развертывания. Аннотация <code>@Alternative</code> может рассматриваться как способ отключения компонента, запрещения его внедрения и разрешения пакетирования реализации с другими компонентами. Добавление компонента в качестве альтернативы в файл <code>beans.xml</code> фактически снова разрешает компонент, делая его доступным для внедрения. Перемещение этого вида метаданных в файл <code>beans.xml</code> позволяет связать различные версии файла с различными развертываниями.</p></li> |
| |
| <li>Для запуска проекта нажмите кнопку 'Запустить проект' ( <img alt="Кнопка 'Выполнить проект'" src="../../../images_www/articles/73/javaee/cdi-common/run-project-btn.png"> ). (В качестве альтернативы нажмите F6; fn-F6 в Mac) В браузере нажмите кнопку '<code>Выполнить</code>' на отображаемой странице. Переключите обратно в IDE и проверьте журнал сервера GlassFish, который отображается в окне вывода (Ctrl-4; ⌘-4 в Mac). |
| |
| <pre class="examplecode"> |
| INFO: Item = exercise2.Item@672f0924 [Value=34, Limit=7] valid = false |
| INFO: Item = exercise2.Item@41014f68 [Value=4, Limit=37] valid = true |
| INFO: Item = exercise2.Item@3d04562f [Value=24, Limit=19] valid = true |
| INFO: Item = exercise2.Item@67b646f4 [Value=89, Limit=32] valid = false</pre> |
| |
| <p>Используется реализация <code>RelaxedItemValidator</code>, а третий элемент отображается как верный, хотя значение (<code>24</code>) больше заданного предела (<code>19</code>).</p></li> |
| </ol> |
| |
| <br> |
| <h2 id="lifecycle">Применение аннотаций жизненного цикла к управляемым компонентам</h2> |
| |
| <p>В этом упражнении <code>ItemErrorHandler</code> будет добавлен в главный класс <code>ItemProcessor</code>. Для добавления выбран <code>FileErrorReporter</code>, поскольку он является единственной реализацией интерфейса <code>ItemErrorHandler</code>. Для настройки зависящих от жизненного цикла действий класса следует использовать аннотации <code>@PostConstruct</code> и <code>@PreDestroy</code> из спецификации управляемых компонентов (включенной в <a href="http://jcp.org/en/jsr/detail?id=316">JSR 316: спецификация платформы Java, Enterprise Edition 6</a>).</p> |
| |
| <div class="indent"> |
| <img alt="На диаграмме CDI отображаются объекты, созданные в этом упражнении" class="margin-around" src="../../../images_www/articles/73/javaee/cdi-validate/cdi-diagram-lifecycle.png" title="Используйте внедрение CDI для свободного взаимодействия классов в используемом приложении"> |
| </div> |
| |
| <p>После этого необходимо создать интерфейс <code>ItemErrorHandler</code> для обработки обнаруженных недопустимых элементов.</p> |
| |
| <ol> |
| <li>В окне "Проекты" щелкните правой кнопкой пакет <code>exercise3</code> и выберите команду "Создать" > "Интерфейс Java".</li> |
| |
| <li>В мастере интерфейсов Java введите имя класса <strong>ItemErrorHandler</strong> и имя пакета <strong>exercise3</strong>. Нажмите кнопку "Завершить". |
| |
| <p>Интерфейс будет создан и открыт в редакторе.</p></li> |
| |
| <li>Добавьте метод <code>handleItem()</code>, принимающий параметр типа <code>Item</code>. |
| |
| <pre class="examplecode"> |
| public interface ItemErrorHandler { |
| <strong>void handleItem(Item item);</strong> |
| }</pre> |
| <p>С помощью подсказки редактора добавьте оператор импорта для <code>exercise2.Item</code>.</p></li> |
| |
| <li>Выполните реализацию <code>ItemErrorHandler</code> с фиктивным обработчиком <code>FileErrorReporter</code>, сохраняющим данные элемента в файл. |
| |
| <p> |
| В окне "Проекты" щелкните правой кнопкой пакет <code>exercise3</code> и выберите команду "Создать" > "Класс Java". Присвойте классу имя <strong>FileErrorReporter</strong> и нажмите кнопку "Готово".</p></li> |
| |
| <li>Сделайте <code>FileErrorReporter</code> реализацией <code>ItemErrorHandler</code> и переопределите метод <code>handleItem()</code> следующим образом. |
| |
| <pre class="examplecode"> |
| public class FileErrorReporter <strong>implements ItemErrorHandler</strong> { |
| |
| <strong>@Override |
| public void handleItem(Item item) { |
| System.out.println("Saving " + item + " to file"); |
| }</strong> |
| }</pre> |
| |
| <p>С помощью подсказки редактора добавьте оператор импорта для <code>exercise2.Item</code>.</p> |
| |
| <p> |
| Вам нужно открыть файл до начала обработки элементов, оставить его открытым в течение процесса добавления содержимого в данный файл, а затем закрыть его по завершении процесса. Можно вручную добавить методы <code>initProcess()</code> и <code>finishProcess()</code> к компоненту средства сообщения об ошибке, но в этом случае вы не сможете выполнить кодирование интерфейса, так как вызывающей стороне будет необходимо знать данные специфичные для класса методы. Можно добавить те же методы к интерфейсу <code>ItemErrorReporter</code>, но в этом случае потребуется выполнить ненужное внедрение данных методов в каждый класс, реализующий данный интерфейс. Вместо этого можно использовать несколько аннотаций жизненного цикла из спецификации управляемых компонентов (входящей в <a href="http://jcp.org/en/jsr/detail?id=316">JSR 316: спецификация платформы Java, Enterprise Edition 6</a>) для вызова методов в компоненте в конкретных точках жизненного цикла компонента. Метод с аннотацией <code>@PostConstruct</code> вызывается после создания компонента и учета всех его зависимостей. Метод с аннотацией <code>@PreDestroy</code> аналогичным образом вызывается непосредственно перед удалением компонента контейнером.</p></li> |
| |
| <li>Добавьте следующие методы <code>init()</code> и <code>release()</code> с аннотациями <code>@PostConstruct</code> и <code>@PreDestroy</code>. |
| |
| <pre class="examplecode"> |
| public class FileErrorReporter implements ItemErrorHandler { |
| |
| <strong>@PostConstruct |
| public void init() { |
| System.out.println("Creating file error reporter"); |
| } |
| |
| @PreDestroy |
| public void release() { |
| System.out.println("Closing file error reporter"); |
| }</strong> |
| |
| @Override |
| public void handleItem(Item item) { |
| System.out.println("Saving " + item + " to file"); |
| } |
| }</pre></li> |
| |
| <li>Исправьте операторы импорта. Либо щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' или нажмите Ctrl-Shift-I (⌘-Shift-I в Mac). В начало файла добавляются операторы импорта для <code>javax.annotation.PostConstruct</code> и <code>javax.annotation.PreDestroy</code>.</li> |
| |
| <li>После этого добавьте новый компонент <code>ItemErrorHandler</code> к <code>ItemProcessor</code>. |
| |
| <pre class="examplecode"> |
| @Named |
| @RequestScoped |
| public class ItemProcessor { |
| |
| @Inject @Demo |
| private ItemDao itemDao; |
| |
| @Inject |
| private ItemValidator itemValidator; |
| |
| <strong>@Inject |
| private ItemErrorHandler itemErrorHandler;</strong> |
| |
| public void execute() { |
| List<Item> items = itemDao.fetchItems(); |
| for (Item item : items) { |
| <strong>if (!itemValidator.isValid(item)) { |
| itemErrorHandler.handleItem(item); |
| }</strong> |
| } |
| } |
| }</pre> |
| <p>С помощью подсказки редактора добавьте оператор импорта для <code>exercise3.ItemErrorHandler</code>.</p> |
| </li> |
| |
| <li>Для запуска проекта нажмите кнопку 'Запустить проект' ( <img alt="Кнопка 'Выполнить проект'" src="../../../images_www/articles/73/javaee/cdi-common/run-project-btn.png"> ). (В качестве альтернативы нажмите F6; fn-F6 в Mac) В браузере нажмите кнопку '<code>Выполнить</code>' на отображаемой странице. Переключите обратно в IDE и проверьте журнал сервера GlassFish, который отображается в окне вывода (Ctrl-4; ⌘-4 в Mac). |
| |
| <pre class="examplecode"> |
| INFO: Creating file error reporter |
| INFO: Saving exercise2.Item@6257d812 [Value=34, Limit=7] to file |
| INFO: Saving exercise2.Item@752ab82e [Value=89, Limit=32] to file |
| INFO: Closing file error reporter</pre> |
| </li> |
| </ol> |
| |
| <div class="feedback-box"> |
| <a href="/about/contact_form.html?to=3&subject=Feedback:%20Using%20CDI%20Injection%20to%20Perform%20Custom%20Validation">Отправить отзыв по этому учебному курсу</a> |
| </div> |
| |
| <br style="clear:both;"> |
| |
| |
| <h2 id="seealso">Дополнительные сведения</h2> |
| |
| <p>Различные развертывания приложений могут использовать различные правила обработки недопустимых элементов: отклонение элементов, отправку уведомлений, выделение элементов или перечисление их в выходном файле. Кроме того, может потребоваться комбинация этих действий (например, отклонить заказ, отправить письмо менеджеру и записать заказ в файл). Оптимальным способом обработки такой многогранной проблемы является использование <em>событий</em>. События CDI рассматриваются в последнем примере этой серии.</p> |
| |
| <ul> |
| <li><a href="cdi-events.html">Обработка событий в CDI</a></li> |
| </ul> |
| |
| <p>Дополнительные сведения о CDI и Java EE приведены в следующих материалах.</p> |
| |
| <ul> |
| <li><a href="cdi-intro.html">Начало работы со внедрением контекстов и зависимостей и JSF 2.0</a></li> |
| <li><a href="cdi-inject.html">Работа с внедрением и квалификаторами в CDI</a></li> |
| <li><a href="javaee-gettingstarted.html">Начало работы с приложениями Java EE</a></li> |
| <li><a href="http://blogs.oracle.com/enterprisetechtips/entry/using_cdi_and_dependency_injection">Технические рекомендации по Java EE: использование CDI и внедрения зависимостей для Java в приложении JSF 2.0</a></li> |
| <li><a href="http://download.oracle.com/javaee/6/tutorial/doc/gjbnr.html">Учебный курс по Java EE 6, часть V: внедрение контекстов и зависимостей для платформы Java EE</a></li> |
| <li><a href="http://jcp.org/en/jsr/detail?id=299">JSR 299: спецификация внедрения контекстов и зависимостей</a></li> |
| <li><a href="http://jcp.org/en/jsr/detail?id=316">JSR 316. Платформа Java, спецификация Enterprise Edition 6</a></li> |
| </ul> |
| |
| </body> |
| </html> |