Ottieni bean gestito JSF per nome in qualsiasi classe correlata a Servlet


Answers

Io uso il seguente metodo:

public static <T> T getBean(final String beanName, final Class<T> clazz) {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}

Questo mi consente di ottenere l'oggetto restituito in modo tipizzato.

Question

Sto cercando di scrivere un servlet personalizzato (per AJAX / JSON) in cui vorrei fare riferimento al mio @ManagedBeans per nome. Spero di mappare:

http://host/app/myBean/myProperty

a:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

È possibile caricare un bean per nome da un servlet regolare? C'è un servlet o un helper JSF che potrei usare per questo?

Mi sembra di essere viziato da Spring in cui tutto questo è troppo ovvio.




Puoi ottenere il bean gestito passando il nome:

public static Object getBean(String beanName){
    Object bean = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    if(fc!=null){
         ELContext elContext = fc.getELContext();
         bean = elContext.getELResolver().getValue(elContext, null, beanName);
    }

    return bean;
}



Io uso questo:

public static <T> T getBean(Class<T> clazz) {
    try {
        String beanName = getBeanName(clazz);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz);
    //return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean);
    } catch (Exception ex) {
        return null;
    }
}

public static <T> String getBeanName(Class<T> clazz) {
    ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class);
    String beanName = managedBean.name();

    if (StringHelper.isNullOrEmpty(beanName)) {
        beanName = clazz.getSimpleName();
        beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1);
    }

    return beanName;
}

E poi chiama:

MyManageBean bean = getBean(MyManageBean.class);

In questo modo puoi rifattorizzare il tuo codice e tracciare gli usi senza problemi.