2010-01-28 11 views
5

Ho trovato che questa parte di codice funziona in quanto posso creare a livello di programmazione un menu a discesa di ricchezze. Ma parte del codice è deprecato. Qualcuno può dirmi cosa mettere al posto delle chiamate deprecate?I richfaces deprecati javax.faces.el.MethodBinding replacement use

Grazie

 public HtmlDropDownMenu getMyMenu() 
{ 
    HtmlDropDownMenu menu = new HtmlDropDownMenu(); 
    menu.setValue("Node Select"); 

    HtmlMenuItem menuItem = new HtmlMenuItem(); 
    // TODO programmatically pass from getNodes into a String[] rather than an ArrayList of SelectItems 
    String subOption = "myBox"; 
    menuItem.setValue(subOption); 

    Application app = FacesContext.getCurrentInstance().getApplication(); 
    javax.faces.el.MethodBinding mb = app.createMethodBinding("#{PrismBacking.onItemClick}", new Class[] { ActionEvent.class }); 
    menuItem.setActionListener(mb); 

    menu.getChildren().add(menuItem); 
    return(menu); 
} 

public void onItemClick(ActionEvent event) 
{ 
    Object obj = event.getSource(); 

    if(obj instanceof HtmlMenuItem) 
    { 
    HtmlMenuItem item = (HtmlMenuItem)obj; 
    if(item != null) 
    { 
    lastItem = item.getValue().toString(); 

    } 
    } 
} 

linee di codice deprecati sono:

javax.faces.el.MethodBinding mb = app.createMethodBinding("#{PrismBacking.onItemClick}", new Class[] { ActionEvent.class }); 
    menuItem.setActionListener(mb); 
+1

BTW: questo non è R I volti specifici. Questi sono solo metodi API standard JSF (dal pacchetto 'javax.faces'), quindi ho aggiunto il tag JSF. – BalusC

risposta

7

I javadocs affermano chiaramente:

Application.createMethodBinding

deprecato. Questo è stato sostituito chiamando getExpressionFactory() quindi ExpressionFactory.createMethodExpression (javax.el.ELContext, java.lang.String, java.lang.Class, java.lang.Class []).

Ecco come usarlo:

MethodExpression methodExpression = 
    application.getExpressionFactory().createMethodExpression(
     FacesContext.getCurrentInstance().getELContext(), 
     "#{PrismBacking.onItemClick}", 
     null, 
     new Class[] { ActionEvent.class }); 
menuItem.setActionExpression(methodExpression); 
+0

Bozho grazie per il puntatore; come sono nuovo a Java, non ho idea di come seguire le istruzioni del manuale.puoi scrivermi uno snippet di esempio per sostituire il bit deprecato nel codice sopra (che ho tagliato e incollato per iniziare). evviva – volvox

+2

Il tipo di ritorno di un metodo 'ActionListener' dovrebbe essere' void', quindi dovresti passare 'null' invece di' Object.class'. – BalusC

+0

corretto. (15) – Bozho

12

Come al solito, tutta la deprecazione è infatti appena descritto nella documentazione API, compresi i dettagli circa la sostituzione.

Per avere una panoramica chiara, qui ci sono sia il pre-JSF 1.2 e post-JSF 1.2 modi per creare un azione e ActionListener dinamicamente:

Creare vincolante azione in JSF 1.0/1.1:

MethodBinding action = FacesContext.getCurrentInstance().getApplication() 
    .createMethodBinding("#{bean.action}", new Class[0]); 
uiCommandComponent.setAction(action); 

Creare ActionListener vincolante in JSF 1.0/1.1:

MethodBinding actionListener = FacesContext.getCurrentInstance().getApplication() 
    .createMethodBinding("#{bean.actionListener}", new Class[] {ActionEvent.class}); 
uiCommandComponent.setActionListener(actionListener); 

Creare espressione d'azione in JSF 1.2 o più recente:

FacesContext context = FacesContext.getCurrentInstance(); 
MethodExpression action = context.getApplication().getExpressionFactory() 
    .createMethodExpression(context.getELContext(), "#{bean.action}", String.class, new Class[0]); 
uiCommandComponent.setActionExpression(action); 

Crea ActionListener espressione in JSF 1.2 o più recente:

FacesContext context = FacesContext.getCurrentInstance(); 
MethodExpression actionListener = context.getApplication().getExpressionFactory() 
    .createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class}); 
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener)); 

Per evitare sacco di codice boilerplate, si può solo avvolgerlo bene in metodi di supporto (se necessario in un/classe di utilità di supporto), ad esempio:

public static MethodExpression createAction(String actionExpression, Class<?> returnType) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context.getApplication().getExpressionFactory() 
     .createMethodExpression(context.getELContext(), actionExpression, returnType, new Class[0]); 
} 

public static MethodExpressionActionListener createActionListener(String actionListenerExpression) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return new MethodExpressionActionListener(context.getApplication().getExpressionFactory() 
     .createMethodExpression(context.getELContext(), actionListenerExpression, null, new Class[] {ActionEvent.class})); 
} 

modo che sia possibile utilizzarlo come segue:

uiCommandComponent.setActionExpression(createAction("#{bean.action}", String.class); 
uiCommandComponent.addActionListener(createActionListener("#{bean.actionListener}"); 
+1

(+1) esauriente come al solito :) – Bozho

+0

Anche se questo è molto vecchio, ma penso che ci sia un errore di battitura qui e dovrebbe essere risolto. Nella tua seconda casella (JSF 1.1), 'uiComp.addActionListener' prende un' ActionListener' come parametro, mentre 'uiComp.setActionListener'ta un parametro' MethodBinding', quindi la tua seconda casella non viene compilata. (Almeno in MyFaces impl 1.1) – medopal

+1

@medopal: hai perfettamente ragione. L'ho risolto – BalusC