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 を Converter 内に注入しようとしています

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;
  }

}

プロパティにアクセスしようとすると、常に null になります。セッターは呼び出されません。

this questionthis oneから、通常の方法で Bean を注入することはできないようです (間違っている場合は修正してください)。毎回EJBから値のリスト全体を取得する(=データベースアクセス)必要を避けるため、代替手段はありますか?

4

2 に答える 2

1

(現在) 依存関係をコンバーターに挿入することはできません。ただし、Seam 3 を使用できる場合は、seam-facesモジュールがこれを有効にします。クラスパスに seam-faces JAR (およびその依存関係) を配置するだけで、コンバーターへの注入が魔法のように機能します。その他の意図しない副作用に注意してください (seam-persistence JAR がクラスパスにある場合、トランザクション境界の違いに気付きました)。

于 2012-05-15T13:42:04.907 に答える
0

この Bean を HttpSession から引き出すことができるはずだと思います (SessionScoped Bean を使用した PhaseListener で機能します)

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 に答える