【问题标题】:JSF/primefaces POJO Autocomplete how to send itemValue to converterJSF/primefaces POJO 自动完成如何将 itemValue 发送到转换器
【发布时间】:2017-11-28 17:50:07
【问题描述】:

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

豆子

class BackingBean{
  POJOClass obj;

  getters and setters
}

POJO 类

class POJOClass{
  String name;
  int id;

  getters and setters
}

在显示时需要在自动完成建议列表中显示名称,但在保存时需要同时保存 id 和 name。

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 方法中获取名称。 另外,不能仅使用名称从数据库中获取对象,但我可以通过 id 获取。

注意:不想通过数据库调用来获取信息。

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

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

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

【问题讨论】:

标签: java jsf primefaces autocomplete jsf-2.2


【解决方案1】:

简而言之,您希望价值观保持不变。为此,您可以使用像 jpa 这样的持久 api,或者简单地将它们更全局地保存在全局对象中,例如用于缓存的对象,其范围是应用程序级别。我认为您正在搜索的是第二个选项。 该对象可能会在应用程序启动时被初始化。

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

【讨论】:

  • 没有。我的目标是在转换器中获取 id 或整个 POJO 对象。
  • @trying: 但你需要从 somwehere... 数据库、缓存、列表等获取 Pojo...
  • @trying 你正在搜索的是缓存。有多种缓存可以存储整个 pojo 对象。如果你需要外部缓存,试试Redis,如果你需要一些api,试试hibenate或jpa(这里你有两级缓存,缓存的对象是DB对象)。
【解决方案2】:

如果您只有一个这样的资源,那么您可以知道需要哪个 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。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2016-01-03
    • 2013-01-31
    • 2011-08-22
    • 2012-03-27
    • 1970-01-01
    相关资源
    最近更新 更多