f:param or f:attribute support on primefaces autocomplete?の解決策に従おうとしましたか? パラメータをprimefaces 3.3.1オートコンプリートコンポーネントに渡すと成功しません。UIComponent.getCurrentComponent().getAttributes によって返される Map で反復すると、.xhtml ファイルで設定した属性名が含まれていないため、属性を取得しようとすると null ポインターが返されます。上記のソリューションの後、primefaces の実装に変更はありますか?
Glassfish 3.1.2 および Mojarra 2.0.9 で Eclipse Indigo を使用しています。
私のコードの一部
xhtml :
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions"
template="WEB-INF/template.xhtml">
...
<p:autoComplete
id="sourceSubMemberLookup" value="#{transactionTransferBacking.sourceSubMember}"
size="64"
completeMethod="#{transactionTransferBacking.completeSourceOpSubMember}"
var="smb" itemLabel="#{smb.displayText}" itemValue="#{smb}"
converter="opSubMemberConverter"
forceSelection="true" dropdown="true"
required="true" rendered="#{loggedInUser.subMemberType eq 1}" >
<f:attribute name="attrSourceMemberId" value="#{transactionTransferBacking.sourceMember.Id">
</p:autoComplete>
...
</ui:composition>
ジャワ:
package com.mysoft.backing;
import java.io.Serializable;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.servlet.http.HttpServletRequest;
import javax.enterprise.context.RequestScoped;
@Named
@ManagedBean
@RequestScoped
public class TransactionTransferBacking implements Serializable {
...
public List<OpSubMember> completeSourceOpSubMember(String query) {
List<OpSubMember> members=null;
//Retrieve list of submembers based on partial user input (autocomplete)
//Based on loggedInUser own member's memberId
FacesContext context = FacesContext.getCurrentInstance();
if (context==null) this.getLogger().debug("completeSourceOpSubMeber: faces is null");
UIComponent current = UIComponent.getCurrentComponent(context);
this.getLogger().debug("completeSourceOpSubMember: currentComponent="+current.getId());
//Map<Object, Object> attrMap = context.getAttributes();
Map<String, Object> attrMap = current.getAttributes();
for (Map.Entry entry : attrMap.entrySet()) {
this.getLogger().debug("completeSourceOpSubMember: attrMap.Key="+entry.getKey());
}
int memberId = (int) attrMap.get("attrSourceMemberId");
this.getLogger().debug("completeSourceOpSubMember: MemberId from attribute = "+memberId);
...
return members;
}
}
ログには、現在のコンポーネント名が目的のオートコンプリートとして正しく出力されますが、問題は、ログに出力されているように、「attrSourceMemberId」が「attrMap」マップにないことです。
君たちありがとう。