Java Primefaces自动完成具有不同值类型的组件,以获得建议和组件值
我不确定这是否可能。。。但是我想使用autoComplete组件,其中value属性是String类型,completeMethod返回一些重对象的列表 我还需要使用Java Primefaces自动完成具有不同值类型的组件,以获得建议和组件值,java,jsf,primefaces,Java,Jsf,Primefaces,我不确定这是否可能。。。但是我想使用autoComplete组件,其中value属性是String类型,completeMethod返回一些重对象的列表 我还需要使用forceSelection=“false” 这是我认为应该起作用的(但没有): 如果您为Demandeur制作一个转换器,这将起作用实际上,问题似乎在于这一部分 itemValue="#{demandeurItem.nom}" 如果itemValue是项目的名称,则转换器将尝试从字符串而不是对象转换。因此,下面的转换器方法将接收
forceSelection=“false”
这是我认为应该起作用的(但没有):
如果您为
Demandeur
制作一个转换器,这将起作用实际上,问题似乎在于这一部分
itemValue="#{demandeurItem.nom}"
如果itemValue是项目的名称,则转换器将尝试从字符串而不是对象转换。因此,下面的转换器方法将接收“value”=string,而不是预期的Demandeur
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) throws ConverterException
我已经尝试了下面的代码,我认为这是你需要的。我在tomee 1.6.0上使用primefaces 4.0
转换器
import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
@ManagedBean
@RequestScoped
public class DemandeurConverter implements Converter, Serializable {
private static final long serialVersionUID = 1L;
@EJB
Demandeurs ejb;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) throws ConverterException {
if (value == null || value.length() == 0) {
return null;
} else {
return ejb.getData().get(Long.parseLong(value));
}
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) throws ConverterException {
System.out.println(value.getClass());
if (value == null) {
return null;
} else {
return ((Demandeur) value).getId().toString();
}
}
}
托管bean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class UtilisateurDemandeurCtrl implements Serializable {
private static final long serialVersionUID = -3027573774106311465L;
@EJB
private Demandeurs ejb;
private Demandeur critereRechercheDemandeur;
public List<Demandeur> completeDemandeur(String query) {
List<Demandeur> l = new ArrayList<Demandeur>();
for(Entry<Long, Demandeur> entryset:ejb.getData().entrySet()){
if (entryset.getValue().getNom().contains(query)){
l.add(entryset.getValue());
}
}
return l;
}
public Demandeur getCritereRechercheDemandeur() {
return critereRechercheDemandeur;
}
public void setCritereRechercheDemandeur(Demandeur critereRechercheDemandeur) {
this.critereRechercheDemandeur = critereRechercheDemandeur;
}
}
还有xhtml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<h:outputScript library="js" name="common.js" />
</h:head>
<h:body>
<h:form id="somePrefix">
<p:autoComplete
id="it_demandeur"
value="#{utilisateurDemandeurCtrl.critereRechercheDemandeur}"
var="demandeurItem"
converter="#{demandeurConverter}"
itemLabel="#{demandeurItem ne null ? demandeurItem.numeroOW.toString().concat(' - ').concat(demandeurItem.nom) : ''}"
itemValue="#{demandeurItem}"
forceSelection="true"
completeMethod="#{utilisateurDemandeurCtrl.completeDemandeur}">
<p:column>
#{demandeurItem.numeroOW} - #{demandeurItem.nom}
</p:column>
</p:autoComplete>
</h:form>
</h:body>
</html>
试验
#{demandeurItem.numeroOW}-{demandeurItem.nom}
我也有同样的问题
这给了我一个错误:itemLabel=“#{user.fullName}”:在java.lang.String类型上找不到属性“fullName”
只有在提交后更新自动完成组件(以显示验证消息)时,才会出现此问题。如果从commandButton中删除“update”属性,它就可以正常工作
<p:panel id="resourceConfigNewFormPanel">
<p:autoComplete id="newUsername" value="#{userResourceConfigurationListBean.resourceConfig.username}" completeMethod="#{userResourceConfigurationListBean.autocompleteUser}" var="user" itemLabel="#{user.fullName}" itemValue="#{user.userName}" forceSelection="true" required="true">
</p:autoComplete>
<p:commandButton value="..." action="..." update="resourceConfigNewForm" oncomplete="if (args && !args.validationFailed) resourceConfigNewDlg.hide()" />
这在有更新和无更新的情况下都适用:
<p:autoComplete id="newUsername" value="#{userResourceConfigurationListBean.resourceConfig.user}" completeMethod="#{userResourceConfigurationListBean.autocompleteUser}" var="user" itemLabel="#{user.fullName}" itemValue="#{user}" converter="#{userNameToUserConverter}" forceSelection="true" required="true">
</p:autoComplete>
您好,我用我尝试使用的转换器更新了我的帖子,但在提交时出现了相同的错误。您是否将转换器设置为
?是的,我设置了转换器属性,并且我可以在调试模式下通过两个重写函数跟踪代码
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class UtilisateurDemandeurCtrl implements Serializable {
private static final long serialVersionUID = -3027573774106311465L;
@EJB
private Demandeurs ejb;
private Demandeur critereRechercheDemandeur;
public List<Demandeur> completeDemandeur(String query) {
List<Demandeur> l = new ArrayList<Demandeur>();
for(Entry<Long, Demandeur> entryset:ejb.getData().entrySet()){
if (entryset.getValue().getNom().contains(query)){
l.add(entryset.getValue());
}
}
return l;
}
public Demandeur getCritereRechercheDemandeur() {
return critereRechercheDemandeur;
}
public void setCritereRechercheDemandeur(Demandeur critereRechercheDemandeur) {
this.critereRechercheDemandeur = critereRechercheDemandeur;
}
}
import java.util.HashMap;
import java.util.Map;
import javax.ejb.Singleton;
@Singleton
public class Demandeurs {
private static final Map<Long,Demandeur> data = new HashMap<Long,Demandeur>(){
private static final long serialVersionUID = -4394378761837292672L;
{
put(1L,new Demandeur(1L,"ooooooooooone",111));
put(2L,new Demandeur(2L,"ttttttttttttwo",222));
}
};
public static Map<Long, Demandeur> getData() {
return data;
}
}
import java.io.Serializable;
public class Demandeur implements Serializable{
private static final long serialVersionUID = 4023658749746098762L;
private Long id;
private String nom;
private Integer numeroOW;
public Demandeur() {}
public Demandeur(Long id, String nom, Integer numeroOW) {
super();
this.id = id;
this.nom = nom;
this.numeroOW = numeroOW;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public Integer getNumeroOW() {
return numeroOW;
}
public void setNumeroOW(Integer numeroOW) {
this.numeroOW = numeroOW;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((nom == null) ? 0 : nom.hashCode());
result = prime * result + ((numeroOW == null) ? 0 : numeroOW.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Demandeur other = (Demandeur) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (nom == null) {
if (other.nom != null)
return false;
} else if (!nom.equals(other.nom))
return false;
if (numeroOW == null) {
if (other.numeroOW != null)
return false;
} else if (!numeroOW.equals(other.numeroOW))
return false;
return true;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<h:outputScript library="js" name="common.js" />
</h:head>
<h:body>
<h:form id="somePrefix">
<p:autoComplete
id="it_demandeur"
value="#{utilisateurDemandeurCtrl.critereRechercheDemandeur}"
var="demandeurItem"
converter="#{demandeurConverter}"
itemLabel="#{demandeurItem ne null ? demandeurItem.numeroOW.toString().concat(' - ').concat(demandeurItem.nom) : ''}"
itemValue="#{demandeurItem}"
forceSelection="true"
completeMethod="#{utilisateurDemandeurCtrl.completeDemandeur}">
<p:column>
#{demandeurItem.numeroOW} - #{demandeurItem.nom}
</p:column>
</p:autoComplete>
</h:form>
</h:body>
</html>
<p:panel id="resourceConfigNewFormPanel">
<p:autoComplete id="newUsername" value="#{userResourceConfigurationListBean.resourceConfig.username}" completeMethod="#{userResourceConfigurationListBean.autocompleteUser}" var="user" itemLabel="#{user.fullName}" itemValue="#{user.userName}" forceSelection="true" required="true">
</p:autoComplete>
<p:commandButton value="..." action="..." update="resourceConfigNewForm" oncomplete="if (args && !args.validationFailed) resourceConfigNewDlg.hide()" />
<p:autoComplete id="newUsername" value="#{userResourceConfigurationListBean.resourceConfig.user}" completeMethod="#{userResourceConfigurationListBean.autocompleteUser}" var="user" itemLabel="#{user.fullName}" itemValue="#{user}" converter="#{userNameToUserConverter}" forceSelection="true" required="true">
</p:autoComplete>