2012-03-29 12 views
6

Tôi rất mới đối với cả CDI và JSF và tôi đang cố chuyển đổi một số mã từ Richfaces 4 showcase để sử dụng CDI thay vì chú thích JSF.Thay thế CDI cho @ManagedProperty

Tôi hiểu rằng tôi có thể sử dụng @Named để thay thế @MangedBean và @Inject để thay thế @ManagedProperty. Nhưng tôi đang gặp rắc rối. Tôi đang cố gắng chuyển đổi ví dụ về Richfaces Tree một cách cụ thể.

tôi đã thực hiện những thay đổi sau đây và tôi biết điều này là không đúng vì vậy xin đừng sử dụng này:

//@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(); 

........ 

Sau đó, tôi thêm vào (và tôi không chắc chắn này là cần thiết):

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

và thay đổi:

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

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

tôi không thể tìm ra cách thích hợp để thay thế @ManagedProperty (value = "# {cd sParser.cdsList} ") sử dụng CDI?

Trả lời

5

cdsList của bạn không phải là lớp đậu bạn cần producer field hoặc producer method để làm cho nó có thể tiêm được.

Ví dụ cho lĩnh vực sản xuất:

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

Ví dụ về phương pháp sản xuất:

import javax.enterprise.inject.Produces; 

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

này hoạt động nếu không có lĩnh vực sản xuất hoặc nhà sản xuất phương pháp khác mà trả về kiểu đậu tương. Nếu không, bạn cần phải giới thiệu một vòng đặc biệt đối với lĩnh vực sản xuất của bạn để giải quyết nhập nhằng:

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 { 
} 

với

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

này có vẻ giả Jboss và không Glassfish ...? – Thufir

+0

@Thufir Đây là Java EE 6 và sẽ chạy trên tất cả các máy chủ phù hợp. –