我想爲我正在開發的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")
註釋的方法,但這似乎並沒有幫助。
我也調整了getCountryValues方法的返回類型 –
你爲什麼要拋棄@ PostConstruct? CDI完全支持它。在getter中進行任何處理通常是一個糟糕的主意:JSF對此表示不滿(在請求處理期間,它會針對不一致的模型狀態拋出驗證錯誤),這通常是不好的做法。 – kolossus
你的權利,我後來意識到,它不僅僅是一個JSF註釋,所以我已經恢復了這一變化,我已經將處理過程轉移到init方法中,併爲值創建了一個變量。 –