1

開発中の JSF プロジェクトに arquillian warp テスト フレームワークを使用したいと考えています。これを機能させるには、JSF アノテーションの代わりに CDI アノテーションを使用する必要があることを理解しています。私は@ViewScopedBeanを使用しているので、これに対処するためにプロジェクトにシームフェイスを含めました(私はJBoss 7で実行しています)。Bean を使用するように変更し、使用@Namedしていた場所で@PostConstructこれをコンストラクターに入れましたが、すべて問題ないようです。

でビューにアクセスすると、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")たが、これは役に立たなかったようです。

4

1 に答える 1

0

この問題は、症状とは無関係でした。問題の根本的な原因はbeans.xml、ear の META-INF ディレクトリではなく、war の WEB-INF ディレクトリにあるはずの場所が間違っていたことです。

seam-facesまた、Apache CODI を使用するように依存関係を変更しました。これは必要ありませんが、別の名前の@ViewAccessScoped代わりにこれを使用する@ViewScoped方が曖昧ではないと思います。

于 2012-12-16T18:13:10.460 に答える