Использование вспомогательных компонентов CDI (Context & Dependency Injection) вместо управляемых компонентов - PullRequest
4 голосов
/ 05 июля 2011

Я ехал, что рекомендуется использовать компоненты CDI в качестве резервных компонентов вместо управляемых компонентов JSF.

Поэтому я решил создать небольшой пример, чтобы понять, как он работает, для @ RequestScopedBean :

вместо использования @ ManagedBean ("beanName") , я использую @ Named ("beanName")

- вместо javax.faces.bean.RequestScopped я использую javax.enterprise.context.RequestScoped;

Демонстрационная программа очень проста, у меня есть поле и кнопка отправки, когда пользователь вводит что-то и страница обновляется, введенное значение больше не отображается (оно продолжается, пока запрос длится верно?). Я думаю, что я все сделал хорошо, но я получаю исключение, которое говорит:

ВНИМАНИЕ: StandardWrapperValve [Faces Servlet]: PWC1406: Servlet.service () для сервлета Faces сервлет метал исключение javax.el.PropertyNotFoundException: /index.xhtml @ 19,47 value = "# {cdiBean.passedValue}": цель Недоступен, идентификатор 'cdiBean' разрешено в ноль

Вот так выглядит моя программа:

index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<h:head>
        <title>RequestScope demo CDI(Component Dependency Injection)</title>
</h:head>

<h:body>

    <h:form>

    <h3>RequestScope demo CDI(Component Dependency Injection)</h3>

    <h:inputText value="#{cdiBean.passedValue}"/>
    <br/>
    <h:commandButton value="submit" action="index"/>

    </h:form>
</h:body>
</html>

DemoBB.java

package backingbeans;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("cdiBean")//The Named anotation indicates that this is a CDI bean
@RequestScoped//If we use CDI beans the @RequestScoped annotation must come from: javax.enterprise.context.RequestScoped;
public class DemoBB {

    //This value will be saved on the session only until the server responds to the request
    private String passedValue;

    public String getPassedValue() {
        return passedValue;
    }

    public void setPassedValue(String passedValue) {
        this.passedValue = passedValue;
    }   
}

-Где моя ошибка?

-В чем преимущество такого подхода? Я до сих пор не понимаю этого.

1 Ответ

3 голосов
/ 05 июля 2011

У вас есть пустой beans.xml вместе с вашим web.xml? Я думаю, что это обязательно.

Читайте раздел 15.6 здесь . Цитата из него:

CDI не определяет никаких специальных архив развертывания. Вы можете упаковать бины в JAR, EJB-JAR или WAR - любые расположение развертывания в приложении CLASSPATH. Тем не менее, архив должен быть "архивом бобов". Это означает, что каждый архив, содержащий бобы включите файл с именем beans.xml в META-INF каталог пути к классам или WEB-INF каталог веб-корня (для Военные архивы). Файл может быть пустым. Бобы, развернутые в архивах, которые не иметь файл beans.xml не будет доступны для использования в приложении.

В встраиваемом контейнере EJB, бобы может быть развернут в любом месте в какие EJB могут быть развернуты. Снова, каждое местоположение должно содержать beans.xml файл.

...