【问题标题】:Select Menu JSF to CDI differences选择菜单 JSF 到 CDI 的区别
【发布时间】:2012-12-03 15:08:49
【问题描述】:

我想将 arquillian warp 测试框架用于我正在开发的 JSF 项目。我知道我需要使用 CDI 注释而不是 JSF 注释才能使其正常工作。我正在使用@ViewScoped bean,所以我在我的项目中包含了接缝面来处理这个问题(我在 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") 注释该方法,但这似乎没有帮助。

【问题讨论】:

  • 我还摆弄了 getCountryValues 方法的返回类型
  • 你为什么取消@PostConstruct? CDI 完全支持它。在 getter 中进行任何处理通常是个坏主意:JSF 对此不以为然(它会在请求处理期间对不一致的模型状态抛出验证错误),而且这通常是不好的做法。
  • 你的权利,后来我意识到这不仅仅是一个 jsf 注释,所以我已经恢复了这个更改,我已经将处理转移到一个 init 方法并为这些值创建了一个变量。
  • 您仍然遇到同样的问题?
  • 是的,仍然是同样的问题,我在想也许我还缺少其他东西。我将编辑并放置整个 bean

标签: jsf-2 cdi


【解决方案1】:

此问题与症状无关。问题的根本原因是beans.xml 定位不正确,这应该在war 的WEB-INF 目录中,而不是ear 的META-INF 目录中。

我还更改了 seam-faces 依赖项以使用 apache CODI,这不是必需的,但它使用 @ViewAccessScoped 而不是 @ViewScoped,我认为不同的名称不那么模棱两可。

【讨论】:

  • CODI 也支持@ViewScoped。 ViewAccessScoped 是一个不同的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多