# JSF2: Managed bean aus anderer Dependency



## Sym (18. Mrz 2011)

Hallo,

vielleicht könnt ihr mir helfen. In meinem JSF2-Maven-Projekt habe ich eine Abhängigkeit auf ein anderes Projekt, welches Managed-Beans beinhaltet (mit entsprechender Annotation).

Leider sind diese Beans null, wenn ich sie verwenden möchte. Sie werden im Context nicht gefunden. 

Was muss ich tun, um die Beans erreichbar zu machen?

Gruß Sym


----------



## JimPanse (18. Mrz 2011)

Verstehe ich nicht? Sind das 2 Web-Projekte? 

Wenn ja -> Der eine Servlet-Kontext hat mit dem anderen nichts zu tun -> d.h. die Beans sind an verschiedene Kontexte gebunden und werden darüber verwaltet. 

Was hast du genau vor? Willst du den Code der Klasse verwenden dann -> abstrakte Oberklasse  und für die einzelnen Web-Projekt eigenständige Bean zu deklarieren die von dieser Klasse erben...

Wenn du möchtest das die Projekte miteinander interagieren sollen (Datenaustausch, etc)  dann entweder über die Datenhaltung, Web-Services oder du versuchst es mit Portlets...


----------



## Sym (18. Mrz 2011)

Nein, das ist nur ein Web-Projekt.

Ich habe allerdings ein anderes Maven-Project, welches ebenfalls Managed-Beans enthält. Dieses Maven-Projekt wird im Web-Projekt referenziert und die Klassen sind natürlich auffindbar. Allerdings sind die Beans nicht im FacesContext enthalten. 

Meine Frage ist, wie ich die Klassen in den Context bekomme.


----------



## JimPanse (18. Mrz 2011)

ok.

dann würde ich es mal auf die 'alte' Weise versuchen:


```
<faces-config>
....
<managed-bean>
     <managed-bean-name> <bean-name> </managed-bean-name>
     <managed-bean-class> <package.classname> </managed-bean-class>
     <managed-bean-scope> <scope [none,request,session,application]> </managed-bean-scope>
</managed-bean>

...
</faces-config>
```

Das sollte auf jedenfall funktionieren!

PS: Ich weiß nicht 100% ob die Dependency-Injection Klassen aus einem eigenständigen Projekt Archiv ausgewertet. Ich vermute mal das nur die Klassen, die im  dem WEB-INF/classes Verzeichnis liegen, ausgewertet werden...
Schon mal in der Spec nachgeschaut -> The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 314


----------



## Sym (18. Mrz 2011)

Ja, nachgeschaut habe ich da schon. Aber wenn es was dazu gibt, habe ich das leider übersehen.

Natürlich könnte ich den "alten Weg" gehen. Allerdings ist das ziemlich umständlich - vor allem, wenn man das für alle Beans machen muss. 

Ich könnte natürlich auch Alle Beans aus dem jeweiligen Packages über die Annotation finden und selbst in den Context schreiben. Aber ich hoffe, dass es dafür einen besseren (oder richtigen) Weg gibt.


----------



## Sym (18. Mrz 2011)

Wie packe ich denn am besten eine Bean (Java-Seitig) manuell in den Context?


----------



## JimPanse (18. Mrz 2011)

Es gibt eine Möglichkeit bzw. eine weitere "old-school" Variante


```
public class <Bean> {

.....code


public static final <Bean> getCurrent<Bean>(
			FacesContext context) {
		if (context == null) {
			context = FacesContext.getCurrentInstance();
		}
		<Bean> bean= (<Bean>) context
				.getApplication().createValueBinding("#{beanname}")
				.getValue(context);

		if (bean == null) {
			bean = new <Bean>();
			context.getApplication().createValueBinding("#{beanname}")
					.setValue(context, bean );
		}
		return bean ;
	}
```

Mit Übergabe des FacesContext wird die Bean entweder initialisiert wenn sie noch nicht vorhanden ist und falls eine Instanz der Bean unter "beanname" vorhandenen ist wird die aktuelle Instanz zurück gegeben...


----------



## Sym (22. Mrz 2011)

Danke, 

irgendwie stand ich an dem Tag auf dem Schlauch und habe den Setter übersehen...

Naja, damit klappt es dann natürlich.

Man nehme:

- ein eigenes Servlet
- Suche alle Beans, die es zu initialisieren gilt (am leichtesten über die Annotation programmatisch finden)
- Setze die Beans in den Context

Und dann klappt es auch mit dem Nachbarn. Das bedeutet, das Servlet muss nur noch in der web.xml angegeben werden und alle Beans sind erreichbar.

Gruß Sym


----------

