2012-03-29 4 views
6

Я очень новичок в CDI и JSF, и я пытаюсь преобразовать код из витрины Richfaces 4, чтобы использовать CDI вместо аннотаций JSF.Замена CDI для @ManagedProperty

Я понимаю, что я могу использовать @Named для замены @MangedBean и @Inject для замены @ManagedProperty. Но у меня проблемы. Я пытаюсь преобразовать пример дерева Richfaces.

Я сделал следующие изменения и я знаю, что это не правильно, так пожалуйста, не используйте это:

//@ManagedBean 
//@ViewScoped 
@Named 
@SessionScoped 
public class TreeBean implements Serializable { 
    private static final long serialVersionUID = 1L; 
// @ManagedProperty(value = "#{cdsParser.cdsList}") 
// private List<CDXmlDescriptor> cdXmlDescriptors; 
    @Inject 
    private Instance<CDXmlDescriptor> cdXmlDescriptors; 
// I also Tried : 
// @Inject 
// private CDParser cdsParser; 
// private List<CDXmlDescriptor> cdXmlDescriptors = cdsParser.getCdsList(); 

........ 

Затем я добавил (а я не уверен, что это необходимо):

@Named 
@SessionScoped 
public class CDXmlDescriptor implements Serializable { ... 

и изменена:

//@ManagedBean(name = "cdsParser") 
@Named("CDParser") 
//@Named 
@SessionScoped 
public class CDParser implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 3890828719623315368L; 
    @Named 
    private List<CDXmlDescriptor> cdsList; 

Я не могу понять, как правильно заменить @ManagedProperty (значение = «# {кд sParser.cdsList} ") с использованием CDI?

ответ

5

Поскольку ваш cdsList не является классом бобов, вам нужен producer field или producer method, чтобы сделать его инъекционным.

Пример для поля производителя:

import javax.enterprise.inject.Produces; 
... 
@Named 
@Produces 
private List<CDXmlDescriptor> cdsList; 

Пример для метода производителя:

import javax.enterprise.inject.Produces; 

private List <CDXmlDescriptor> cdsList; 
... 
@Named("cdsList") 
@Produces 
public List<CDXmlDescriptor> getCdsList { 
    return cdsList; 
}; 

Это работает, если нет другого поля производителя или производителя метода, который возвращает один и тот же тип компонента. В противном случае вам нужно ввести специальный классификатор для поля производителя для разрешения неоднозначности:

import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.ElementType.FIELD; 
import static java.lang.annotation.ElementType.PARAMETER; 
import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 
import javax.inject.Qualifier; 


@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface CdsList { 
} 

с

@Named @Produces @CdsList 
private List<CDXmlDescriptor> cdsList; 
+0

это, кажется, предположить, JBoss и не Glassfish ...? – Thufir

+0

@Thufir Это Java EE 6 и должен работать на всех совместимых серверах. –

Смежные вопросы