需要使用带有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的新手。
答案 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。