2012-12-16 25 views
1

我想爲我正在開發的JSF項目使用arquillian warp測試框架。據我所知,我需要使用CDI註釋而不是JSF的註釋來實現這個功能。我正在使用@ViewScoped bean,所以我在我的項目中包含了seam-faces來處理這個問題(我正在JBoss 7上運行)。我修改了我的beans以使用@Named和我正在使用的地方@PostConstruct我已經把它放到了構造函數中,這一切似乎都沒問題。Select menu JSF to CDI differences

當我使用selectOneMenu訪問視圖時,它從來沒有任何列表項。這裏是視圖和bean的代碼形式。

查看:

<h:selectOneMenu value="#{ngoBean.ngo.country}" > 
    <f:selectItems value="#{ngoBean.countryValues}" /> 
</h:selectOneMenu> 

豆:

import com.a.Facade; 
import com.a.CountryEnum; 
import com.a.GoverningBody; 

import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.faces.bean.ViewScoped; 
import javax.faces.model.SelectItem; 
import javax.inject.Named; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created with IntelliJ IDEA. 
*/ 
@Named("ngoBean") 
@ViewScoped 
public class NgoBean implements Serializable { 

    private GoverningBody ngo = new GoverningBody(); 
    private List<GoverningBody> ngoList; 
    private boolean edit; 

    private List<SelectItem> countryValues; 

    @EJB(beanName = "NgoFacadeImpl") 
    private Facade<GoverningBody> ngoController; 

    public NgoBean(){ 
    } 

    @PostConstruct 
    public void init(){ 
     //TODO this is a bad way of loading db data i should change it 
     ngoList = ngoController.findAll(); 

     countryValues = initCountryValues(); 
    } 

    public void add(){ 
     ngoList.add(ngoController.save(ngo)); 

     //reset the variable 
     ngo = new GoverningBody(); 
    } 

    public void edit(GoverningBody item) { 
     this.ngo = item; 
     edit = true; 
    } 

    public void save() { 
     ngo = ngoController.update(ngo); 
     edit = false; 
    } 

    public void delete(GoverningBody item) { 
     ngoController.delete(item); 
     ngoList.remove(item); 
    } 

    public List<GoverningBody> getNgoList() { 
     return ngoList; 
    } 

    public GoverningBody getNgo() { 
     return ngo; 
    } 

    public boolean isEdit() { 
     return edit; 
    } 

    public List<SelectItem> getCountryValues() { 
     return countryValues; 
    } 

    public void setCountryValues(List<SelectItem> countryValues) { 
     this.countryValues = countryValues; 
    } 

    public List<SelectItem> initCountryValues() { 
     List<SelectItem> items = new ArrayList<>(CountryEnum.values().length); 
     int i = 0; 
     for(CountryEnum g: CountryEnum.values()) { 
      items.add(new SelectItem(g, g.getName())); 
     } 

     System.out.println("items = " + items); 
     return items; 
    } 
} 

我試着用@Factory("countryValues")註釋的方法,但這似乎並沒有幫助。

+0

我也調整了getCountryValues方法的返回類型 –

+0

你爲什麼要拋棄@ PostConstruct? CDI完全支持它。在getter中進行任何處理通常是一個糟糕的主意:JSF對此表示不滿(在請求處理期間,它會針對不一致的模型狀態拋出驗證錯誤),這通常是不好的做法。 – kolossus

+0

你的權利,我後來意識到,它不僅僅是一個JSF註釋,所以我已經恢復了這一變化,我已經將處理過程轉移到init方法中,併爲值創建了一個變量。 –

回答

0

此問題與症狀無關。問題的根本原因是位置不正確beans.xml這應該在戰爭的WEB-INF目錄中,而不是在耳朵的META-INF目錄中。

我也改變了seam-faces依賴使用Apache CODI,這不是必要的,但這使用@ViewAccessScoped而不是@ViewScoped不同的名字是不太模糊我認爲。

+0

CODI也支持@ViewScoped。 ViewAccessScoped是一個不同的範圍。 –

+0

哦謝謝,我沒有意識到這一點 –