从JSF Converter类访问EntityManager

时间:2014-10-12 19:05:34

标签: jsf jpa converter

我正在尝试编写一个转换器类,它将在Employee对象和String之间进行转换(用于显示目的)。最终目标是在表单上有一个SelectOne字段,显示数据库中所有员工编号的列表。

这是我到目前为止所拥有的:

@FacesConverter(value = "employeeConverter")
public class EmployeeConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Employee tmp = Helper.findEmployee(em, value);
        return tmp;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        Employee tmp = (Employee) value;
        return tmp.getEMPLOYEE_NUMBER();
    }
}

所以,我遇到的问题是Helper类(基本上为我运行SQL查询 - 如果需要我可以包含它)需要我传递EntityManager。正如我通过搜索发现的那样,我不能只在这个类中包含EntityManager,因为它超出了Web内容的“范围”。

我不熟悉在网络上使用Java,而在Java中使用数据库则是新手。有人可以解释我如何使用转换器以这种方式查询我的数据库,并在其中有一个带有员工编号的选择框。

1 个答案:

答案 0 :(得分:1)

由于转换器方法包含对FacesContext的引用,因此您始终可以使用该方法来评估将在问题中返回您的服务的EL表达式。

如果您没有使用任何专用的DataServices,您可以使用" Helper bean",它只会包含对EntityManager的引用:

@Named
public class RandomHelperBean{

   @PersistenceContext(unitName = "yourPersistenceContext") 
   EntityManager em;

   public EntityManager getEm(){
      return em;
   }
}

并在您的转换器中:

public Object getAsObject(FacesContext context, UIComponent component, String value) {

    RandomHelperBean rhb= context.getCurrentInstance().getApplication().evaluateExpressionGet(context, "#{randomHelperBean}", RandomHelperBean.class);
    EntityManager em = rhb.getEm();
    Employee tmp = Helper.findEmployee(em, value);
    return tmp;
}

几乎未经测试,但它应该是这样的。