Kurs-FAQ zur Java EE 5 DVD
Hier
trage ich die Antworten zu allen an mich gestellten Fragen zur Kurs-DVD
"Java EE 5" zusammen, die allgemein von Interesse sein
könnten.
Bisher sind dies...
- Rohmaterial zu Kap. "Webapplikationen"
- No provider specified for RecipeDBMgr!
Rohmaterial zu
Kap. "Webapplikationen"
Sie beginnen Kapitel "Webapplikation"
> "Automatisiertes Build - Teil I" im Eclipse mit dem
Projekt recipe-db, welches bereits viele Dateien enthält. Wenn
ich jetzt im Rohmaterial in den Ordner Webapplikationen/Out gehe,
finde ich das src und test-Verzeichnis mit den Daten. Wo finde ich
aber die Daten für den Webordner?
Hier muss uns beim Zusammenstellen der DVD ein Fehler unterlaufen
sein. Alle Dateien, die in einem Kapitel vorausgesetzt werden, sollten
entweder im vorhergehenden Kapitel erstellt worden sein oder direkt
im Rohmaterialordner zu diesem Kapitel liegen.
Verwenden Sie in diesem speziellen Fall bitte einfach die gleichnamigen
Dateien aus dem Ordner rohmaterial\Ein_Provider_mit_EJBs\recipe-db\web.
No provider specified
for RecipeDBMgr!
Ich bekomme immer die IllegalStateException
"No provider specified for RecipeDBMgr! Set system property
de.dialogdata.recipedb.model.RecipeDBMgr.providerClass".
S ie wird in der klasse RecipeDBMgrFactory in der Methode createManager
geworfen, ich weiss aber nicht was ich machen soll oder wo ich das
system Property setzen soll.
Die Klasse RecipeDBMgrFactory ist eine Umsetzung des
OO-Patterns "Abstract Factory" (siehe hierzu z.B.: http://en.wikipedia.org/wiki/Abstract_factory_pattern).
Das Ziel dieses Patterns ist es, die Implementierung der Model-Interfaces
transparent zu halten und später beliebig konfigurieren zu
können.
Für das Kursbeispiel bedeutet das konkret: Bei Aufruf der Methode
createManager() liefert die Factory eine konkrete Klasse,
die das Interface RecipeDBMgr implementiert. Ob der
konkrete RecipeDBMgr auf Dateien arbeitet oder via
JPA in eine Datenbank persistiert, ist für den Programmierer,
der das Model über seine Schnittstelle benutzt, irrelevant.
Welche Variante (Dateien oder Datenbank) des RecipeDBManagers die
Factory zurückgibt, wird über das System Property "de.dialogdata.recipedb.model.RecipeDBMgr.providerClass"
konfiguriert (siehe auch Konstante RecipeDBMgrFactory.PROVIDER_CLASS).
RecipeDBMgrFactory liest dieses System Property und
erwartet als Wert den "full qualified classname" einer
Klasse, die ein Subtyp von RecipeDBMgrFactory ist.
Im Falle der Webapplikation im Beispiel übernimmt ein AppStartupListener
die Aufgabe, dieses Property zu setzen. Die Klasse AppStartupListener
implementiert das Java EE Interface ServletContextListener,
und wird im Deploymentdescriptor web.xml (Datei web/WEB-INF/web.xml)
registriert:
<web-app [...]>
[...]
<listener>
<listener-class>de.dialogdata.recipedb.AppStartupListener</listener-class>
</listener>
</web-app>
AppStartupListener setzt in der Callback-Methode contextInitialized(ServletContextEvent),
die der Applikationsserver beim Deployment der Webapplikation aufruft,
das System Property "de.dialogdata.recipedb.model.RecipeDBMgr.providerClass"
(RecipeDBMgrFactory.PROVIDER_CLASS):
System.setProperty(
RecipeDBMgrFactory.PROVIDER_CLASS,
"de.dialogdata.recipedb.model.fileprovider.RecipeDBMgrFile");
System.setProperty(
RecipeDBMgrFile.REPOSITORY_DIR,
"c:/jee5dvd/recipe-repository");
Die Fehlermeldung "No provider specified for RecipeDBMgr!
Set system property de.dialogdata.recipedb.model.RecipeDBMgr.providerClass"
hat wahrscheinlich zur Ursache, dass der AppStartupListener
nicht ausgeführt wird. Überprüfen Sie die aus dem
Projekt erstellte WAR-Datei. Ist im Archiv WEB-INF/web.xml
enthalten? Enthält die Datei die oben beschriebenen Zeilen?
|