it-swarm.com.de

Rufen Sie die JSF-verwaltete Bean nach Namen in einer Servlet-Klasse ab

Ich versuche, ein benutzerdefiniertes Servlet (für AJAX/JSON) zu schreiben, in dem ich meinen @ManagedBeans anhand seines Namens referenzieren möchte. Ich hoffe zu kartieren:

http://Host/app/myBean/myProperty

zu: 

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

Kann ein Bean nach Namen von einem regulären Servlet geladen werden? Gibt es ein JSF-Servlet oder einen Helfer, den ich dafür verwenden könnte?

Ich scheine vom Frühling verwöhnt zu werden, in dem das alles zu offensichtlich ist.

96
Konrad Garus

In einem Servlet können Sie Anfrage-Beans erhalten, indem Sie:

Bean bean = (Bean) request.getAttribute("beanName");

und Session-basierten Beans von:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

und anwendungsspezifische Beans von:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

Wenn Sie in einem Abhängigkeitsinjektions-fähigen Framework/Container laufen und das Bean von CDIs @Named statt von JSFs @ManagedBean verwaltet wird, ist es noch einfacher:

@Inject
private Bean bean;

Wenn Sie tatsächlich innerhalb der FacesContext sind (dh die aktuelle HTTP-Anforderung wurde über die FacesServlet ausgeführt), verwendet der normale JSF2-Weg Application#evaluateExpressionGet() :

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

die wie folgt abgerufen werden kann:

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

und kann wie folgt verwendet werden:

Bean bean = findBean("bean");

Wenn Sie sich jedoch bereits in einem @ManagedBean befinden, ist die Verwendung von @ManagedProperty sauberer, da sie eher deklarativ ist.

@ManagedProperty("#{bean}")
private Bean bean;
253
BalusC

Ich verwende die folgende Methode:

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);
}

Dadurch kann ich das zurückgegebene Objekt auf typisierte Weise abrufen.

10
John Yeary

Sie können das verwaltete Bean erhalten, indem Sie den Namen übergeben:

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;
}
3
Soujanya

Haben Sie einen Ansatz wie auf diesem Link versucht? Ich bin nicht sicher, ob createValueBinding() noch verfügbar ist, aber Code wie dieser sollte von einem einfachen alten Servlet aus zugänglich sein. Dies erfordert, dass es bereits existiert.

http://www.coderanch.com/t/211706/JSF/Java/access-managed-bean-JSF-von

 FacesContext context = FacesContext.getCurrentInstance();  
 Application app = context.getApplication();
 // May be deprecated
 ValueBinding binding = app.createValueBinding("#{" + expr + "}"); 
 Object value = binding.getValue(context);
3
James P.

Ich hatte die gleiche Anforderung. 

Ich habe den folgenden Weg benutzt, um ihn zu bekommen. 

Ich hatte Sitzungsbohnen. 

@ManagedBean(name="mb")
@SessionScopedpublic 
class ManagedBean {
     --------
}

Ich habe den folgenden Code in meiner Servlet-Methode doPost () verwendet. 

ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");

es hat mein Problem gelöst.

0
Anil