2016-08-01 2 views
0

J'ai essayé d'obtenir une boîte de dialogue "générique", avec fonctionnalité de saisie semi-automatique, pour fonctionner pendant quelques jours maintenant. Il s'avère que je ne fais que créer la méthode MethodExpression "à l'envers". Donc j'ai pensé que je documenterais ceci ici. Pour réitérer: Vous souhaitez créer dynamiquement une expression de méthode, la stocker dans une propriété et l'utiliser dans un modèle JSTL ou une page JSF.Création de MethodExpression en Java (et utilisation dans JSF)

Par exemple:

// Template 
<c:forEach items="#{property.subItems}" var="subitem"> 
    <ui:include src="editor.xhtml"> 
    <ui:param name="autocompleteMethod" value="#{subitem.autocompMethod}" /> 
    </ui:include> 
</c:forEach> 

// editor.xhtml 
// We're using RichFaces (unfortunately), but this is just an example 
<rich:autocomplete mode="cachedAjax" minChars="2" 
     autocompleteMethod="#{autocompleteMethod}" 
/> 
+1

Comment pensez-vous que ce soit un doublon? La question que vous avez liée utilise des cadres spécifiques comme OmniFaces et PrimeFaces pour résoudre le problème. La chose principale ici est de savoir comment construire un MethodExpression à partir du code. Je l'utilise peut-être dans un widget RichFaces, mais ce n'est qu'un exemple d'utilisation et peut être remplacé. La solution elle-même est pure JSF et fonctionne avec tous les frameworks * Faces. –

Répondre

0

J'ai trouvé la solution à http://javaevangelist.blogspot.co.at/2012/10/jsf-2x-tip-of-day-programmatically_20.html

public static MethodExpression createMethodExpression(String methodExpression, Class<?> expectedReturnType, Class<?>[] expectedParamTypes) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context.getApplication().getExpressionFactory() 
      .createMethodExpression(context.getELContext(), methodExpression, expectedReturnType, expectedParamTypes); 
} 

Vous pouvez ensuite créer un MethodExpression et le stocker dans une propriété. Pour RichFaces autocomplete, la signature est: List<String> autocomplete(String prefix)

@SuppressWarnings("rawtypes") // Generics use type erasure 
Class<List> retType = List.class; 
Class<?>[] paramTypes = {String.class}; 
MethodExpression autocompleteMethod = createMethodExpression("#{myBean.myAutocomplete}", retType, paramTypes); 
// In the questions example, we'd need to set a property here: 
this.autocompMethod = autocompleteMethod; 

Puis ont le getter apropriate:

MethodExpression getAutocompMethod() { 
    return this.autocompMethod; 
}