2016-08-01 3 views
0

Ich habe versucht, einen "generischen" Dialog mit Autocomplete-Funktionalität für ein paar Tage zu erhalten. Es stellte sich heraus, dass ich die MethodExpression nur "falsch" erstellt habe. Also dachte ich, ich würde das hier dokumentieren.MethodExpression in Java erstellen (und in JSF verwenden)

Nochmal wiederholen: Sie möchten einen MethodExpression dynamisch erstellen, in einer Eigenschaft speichern und in einer JSTL-Vorlage oder JSF-Seite verwenden.

Zum Beispiel:

// 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

Wie denken Sie, dies ist ein Duplikat ist? Die Frage, die Sie gestellt haben, verwendet spezielle Frameworks wie OmniFaces und PrimeFaces, um das Problem zu lösen. Die Hauptsache hier ist, wie man eine MethodExpression aus Code erstellt. Ich könnte es in einem RichFaces-Widget verwenden, aber das ist nur ein Anwendungsbeispiel und kann ersetzt werden. Die Lösung selbst ist reines JSF und funktioniert mit allen * Faces-Frameworks. –

Antwort

0

ich die Lösung bei 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); 
} 

gefunden haben, können Sie dann eine method erstellen und speichern sie in einer Eigenschaft. Für die automatische Vervollständigung Richfaces, ist die Signatur: 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; 

dann die apropriate Getter haben:

MethodExpression getAutocompMethod() { 
    return this.autocompMethod; 
} 
Verwandte Themen