home > knowhow > jee5dvd > faq
[JEE 5 DVD]

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...

  1. Rohmaterial zu Kap. "Webapplikationen"
  2. 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?

 

 

startseite
knowhow
verweise
media
ideen
ich




nicht angemeldet
?