JSF / primefaces POJO自动完成如何将itemValue发送到转换器

时间:2017-06-25 20:39:23

标签: java jsf primefaces autocomplete jsf-2.2

需要使用带有POJO(比如名称,id)的JSF / primefaces自动完成来显示数据并在DB中保存有关所选对象的信息。

class BackingBean{
  POJOClass obj;

  getters and setters
}

POJO课程

class POJOClass{
  String name;
  int id;

  getters and setters
}

虽然显示需要在自动填充建议列表中显示名称,但保存时需要同时保存ID和名称。

使用Primefaces代码

<p:autocomplete value="#{backingbean.obj}" var="object" itemValue="#{object}" itemLabel="#{object.name}"/>

转换器

Class MyConverter ...
{
 public Object getAsObject(FacesContext fc, UIComponent uic, String value){
    String name=value;
    POJO myPOJO=new POJO();
    myPOJO.setName(name);
    myPOJO.setId(???)//need id information as well over here
    return myPOJO;
 }
  public String getAsString(...){
    //returns name to display
  }
}

只能在转换器的getAsObject方法中获取名称。 此外,不能仅使用名称从DB获取对象,但通过id我可以。

注意:不想进行数据库调用以获取信息。

简而言之就是在转换器的getAsObject中获取id或在转换器中获取整个POJO对象。不确定是否有其他方法可以实现此目的。

我们如何实现这一目标的任何线索?

注意:我是JSF / Primefaces的新手。

2 个答案:

答案 0 :(得分:0)

简而言之,您希望值保持不变。为此,您可以使用像jpa这样的持久性api,也可以将它们全局保存在全局对象中,例如用于缓存范围为应用程序级别的全局对象。我认为你在寻找的是第二种选择。 应用程序启动时可以初始化此对象。

  

如果在缓存中找到密钥,则获取值,否则执行db调用。

答案 1 :(得分:0)

如果您只有这样的资源,那么您就可以知道需要哪个POJOClass实例。您可以在托管环境中使用EL表达式(由容器管理的转换器)。在这种情况下,您只需要通过转换器转换名称字段,并通过EL表达式访问唯一的ID:

Class MyConverter ...
{
  public Object getAsObject(FacesContext fc, UIComponent uic, String value)
  {
    String name=value;
    POJO myPOJO=new POJO();
    myPOJO.setName(name);
    myPOJO.setId( getPOJOId() );
    return myPOJO;
 }

 public String getAsString(...)
 {
    //returns name to display
  }

  protected int getPOJOId()
  {
    FacesContext context = FacesContext.getCurrentInstance();
    POJOClass pojo = context.getApplication().evaluateExpressionGet(context, "#{backingBean.obj}", POJOClass.class);
    return pojo.getId();
  }
}

如果您有许多POJOClass实例,请将ID存储在隐藏组件中并访问其值以获取ID。