0

我有以下 ApplicationScoped bean

package es.caib.gesma.gesman.data;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import es.caib.gesma.gesman.ejb.Dao;

@ManagedBean(name="priorityList")
@ApplicationScoped
public class PriorityList {

  @EJB
  Dao daoEjb;

  private List<Priority> priorities = null;

    public PriorityList() {
    }

    @PostConstruct
    public void refresh() {
      this.priorities = daoEjb.findPriorities();
    }

    public List<Priority> getPriorities() {
      return this.priorities;
    }

    public Priority fromId(int id) {
      for(Priority priority : this.priorities) {
        if (priority.getId() == id) {
          return priority;
        }
      }
      return null;
    }
  }

我尝试将该bean注入转换器

package es.caib.gesma.gesman.data.converter;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import es.caib.gesma.gesman.data.Priority;
import es.caib.gesma.gesman.data.PriorityList;

@ManagedBean
@ApplicationScoped
public class PriorityConverter implements Converter {

  @ManagedProperty("#{priorityList}")
  private PriorityList priorityList;

  @Override
  public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
    ...
  }

  @Override
  public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
    ...
  }

  public void setPriorityList(PriorityList priorityList) {
    System.out.println("SET PRIORITYLIST " + priorityList);
    this.priorityList = priorityList;
  }

}

每当我尝试访问该属性时,它都是空的。setter 永远不会被调用。

这个问题这个问题来看,似乎无法以通常的方式注入 bean(如果我错了,请纠正我)。有什么替代方法可以避免每次都从 EJB(= 数据库访问)中获取整个值列表吗?

4

2 回答 2

1

您不能(当前)将依赖项注入转换器。但是,如果您可以使用 Seam 3,则seam-faces模块将启用此功能。您不需要做任何特别的事情,只需在类路径中添加 seam-faces JAR(及其任何依赖项),然后注入转换器就会神奇地起作用。只需注意其他意外的副作用(当 seam-persistence JAR 位于类路径中时,我注意到事务边界的差异)。

于 2012-05-15T13:42:04.907 回答
0

我认为你应该能够从 HttpSession 中拉出这个 bean(它在 PhaseListener 和 SessionScoped bean 中对我有用)

FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
SessionForm sessionBean = (SessionForm) session.getAttribute("priorityList");

或者,如果我可以从 BalusC 借用关于JSF 通信的文章,底部描述了如何从 ManagedBean 制作转换器(这样您就可以轻松地在那里注入您的 ApplicationScoped bean)

于 2012-05-15T08:08:51.650 回答