Вводить неуправляемые классы с помощью CDI? - PullRequest
2 голосов
/ 28 марта 2012

Я заменяю объявления управляемого bean-компонента вface-config на CDI (Weld).

Проблема в основном заключается в следующем:

проект структурирован на "web" и "core".В Web есть бины, которые объявлены как управляемые бины.У них также есть объявленные свойства, которые не являются бобами, а pojos (?).Базовые классы - это классы интеграции, доменные классы и т. Д.

Я не могу назвать базовый класс с помощью @Named, потому что он явно не знаком с артефактами в веб-части приложения.

Сегодня они определены следующим образом:

    <managed-property>
        <property-name>UserData</property-name>
        <value>#{sessionScope.UserData}</value>
    </managed-property>

Я пытаюсь прочитать об этом, но был бы признателен за помощь.

Как добавить управляемое свойство, которое не является управляемым компонентом, с помощью CDI (или даже JSF2?)

Инъекция управляемых bean-компонентов в управляемые bean-компоненты работает безупречно, и CDI действительно работает, как для меня, поэтому я надеюсь решить эту проблему в ближайшее время.

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Наше приложение вставляет эти объекты при запуске сеанса или приложения.Все, что мне было нужно, это продюсер, который получает их из внешнего контекста и возвращает их.Мое решение следующее:

Суперпроизводитель:

import java.util.Map;
import javax.faces.context.FacesContext;
import javax.inject.Inject;

/**
 * @author Karl Kildén
 *
 * Superclass that should be extended for other producers that uses ext context. 
 */
public class BaseExtContextProducer {

    @Inject
    protected FacesContext facesContext;

    // map used to get UserData objects
    protected Map<String, Object> parameterMap = (Map<String, Object>) facesContext
        .getExternalContext().getSessionMap();

    // variable name i.e "your variable" + message is used for Exception messages
    protected final String message = " may not be null";
}

Фактический макет производителя, который возвращает мои объекты:

    import javax.enterprise.context.ApplicationScoped;
    import javax.enterprise.inject.Produces;
    import org.jboss.weld.exceptions.NullInstanceException;

    import com.wmdata.raindance.portal.annotation.qualifiers.FromExtContext;
    import com.wmdata.raindance.portal.tool.UserMessage;

    /**
     * 
     * @author Karl Kildén
     * 
     * This producer gets YourObject that is stored in the external context.
     */


      public class YourObjectProducer extends BaseExtContextProducer {

            @Produces
    //Qualifiers, scopes etc
            @ApplicationScoped @FromExtContext
            public YourObject getYourObject() {
            YourObject yourObject = (YourObject) parameterMap
                .get(YourObject.getStaticName);

            if (YourObject == null) {



// Suggestion: use enum or static name to avoid getting with "" for cleaner code
    throw new NullInstanceException(null,
                YourObject.getStaticName + message);
        }

        return userMessage;
        }
    }
2 голосов
/ 29 марта 2012

Как внедрить управляемое свойство, которое не является управляемым компонентом, с помощью CDI (или даже JSF2?)

Если я правильно понял вашу проблему, тогда CDI-Extension - ваш путь. Что вы можете сделать, это зарегистрировать расширение, которое анализирует ваши не-CDI-компоненты во время запуска, оборачивает их как AnnotatedType и тем самым делает их доступными для инъекции.

Взгляните на главу 16 в документации по сварке , особенно 16.6, которая очень похожа на ваш вариант использования.

И: не беспокойтесь, если «написание собственных расширений» звучит как взлом фреймворка. CDI был разработан с учетом концепции расширения, и регистрация собственного фрагмента кода в качестве расширения чрезвычайно проста и прямолинейна.

1 голос
/ 29 марта 2012

В соответствии с запросом комментариев, вот как вы будете это делать при использовании стандартных аннотаций JSF.

С учетом этой регистрации управляемого бина JSF 1.x:

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>com.example.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>userData</property-name>
        <value>#{sessionScope.userData}</value>
    </managed-property>
</managed-bean>

Вот как JSF 2.x аннотации могут быть установлены, чтобы избавиться от этой регистрации XML в стиле JSF 1.x:

package com.example;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Bean {

    @ManagedProperty("#{sessionScope.userData}")
    private UserData userData;

    // ...
}
...