2012-03-28 7 views
2

Я заменяю объявления управляемого bean в faces-config с CDI (Weld).Внедрение неконтролируемых классов с CDI?

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

проект структурируется в «сети» и «ядро». В Интернете есть компоненты, объявленные как управляемые компоненты. У них также есть объявленные свойства, которые не являются фасолью, а pojos (?). Ключевыми классами являются классы интеграции, классы домена и т. Д.

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

Сегодня они указаны как этот

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

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

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

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

Приветствия

+0

С JSF2 аннотации можно было бы с помощью '@ManagedProperty (" # {sessionScope.userData } ")' на нужном свойстве 'userData' класса' @ ManagedBean'. Не знаю, как это сделать с CDI. Кстати, ваша капитализация имени переменной экземпляра неверна. Он должен начинаться с строчной буквы. – BalusC

+0

Сообщение об ошибке при попытке просто впрыскивать было забыто: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Неудовлетворенные зависимости для типа [FPUserData] с квалификаторами [@Default] в точке впрыска [[поле] @Inject private com .wmdata.raindance.portal.ui.RPBaseController.fpUserData] –

+0

Теперь я боюсь, когда сам гуру не знает. Вы правы в имени переменной экземпляра, я вырезал часть имени, которая ничего не значила бы для других, чтобы повысить читаемость. –

ответ

2

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

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

Взгляните на главу 16 в Weld documentation, особенно 16.6 выглядит так же, как ваш usecase.

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

+1

После некоторого чтения я окончательно считаю, что этот ответ действительно. Мне было нужно другое решение, но это потому, что я не задал правильные термины в моем вопросе. –

1

В соответствии с комментариями, вот как вы это сделаете при использовании стандартных аннотаций 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> 

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

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; 

    // ... 
} 
+0

Большое спасибо. Первоначально я чувствовал, что мне нужно будет использовать это решение на основе el и иметь жалкую стычку между спецификациями. Рад, что мне не придется. Но снова вы являетесь отличным вкладчиком для пользователей jsf –

2

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

суперпродуцента:

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; 
     } 
    } 
Смежные вопросы