Modulare Konfiguration mit Spring Beans

Unsere Java-Web-Applikationen bestehen aus mehreren Komponenten. Mit Hilfe des Spring-Frameworks können diese Komponenten leicht ausgetauscht und angepasst werden. Wir liefern zahlreiche Komponenten mit, beispielsweise für die folgenden Aufgaben:

  • Ermittlung von Benutzern
  • Auslieferung von Inhalten
  • Zugriffsschutz
  • Authentifizierung

Jede dieser Komponenten ist ein sogenanntes Bean. Über eine oder mehrere XML-Dateien lässt sich die Zusammenstellung der Komponenten für die Web-Applikation festlegen. Dies bedeutet, dass der Funktionsumfang und das Verhalten der Applikation einfach an die Erfordernisse angepasst werden können, indem die Konfigurationsdateien entsprechend geändert werden. Auf diese Weise können auch kundenspezifische Komponenten integriert werden.

Jedes Bean basiert auf einer Java-Klasse. Wird ein Bean verwendet, so erzeugt das Spring Framework ein Objekt der entsprechenden Klasse. Ein Bean wird folgendermaßen eingebunden:

<bean id="sessionInvalidator" class="com.infopark.pm.DefaultSessionInvalidator"/>

Über die optionale id kann das Bean an anderer Stelle referenziert werden.

Falls ein Bean Eigenschaften hat, die an die Installation angepasst werden müssen, können diese auf folgende Weise gesetzt werden:

<bean id="httpHelper" class="com.infopark.libs.http.ApacheHttpHelper">
  <property name="connectionTimeout" value="3"/>
  <property name="defaultSocketTimeout" value="60"/>
  <property name="maxConnections" value="10"/>
</bean>

Ein Bean kann auf die Funktionalität eines anderen Beans zugreifen. So benötigt beispielsweise das Bean permissionManager Zugriff auf Inhalte. Damit man bei der Wahl des Beans, das die Inhalte bereitstellt, flexibel ist, verfügt der permissionManager über eine Eigenschaft documentSource. Dieser Eigenschaft kann per Referenz das zu verwendende Bean zugewiesen werden. Im folgenden Beispiel wird zunächst das Bean externalDocumentSource zur Bereitstellung der Inhalte konfiguriert. Anschließend wird das Bean permissionManager eingebunden, das auf die Inhalte über das Bean externalDocumentSource zugreift. Die Eigenschaften permissionReader und permissionResolver werden ebenfalls mit einem Bean belegt. Da das jeweilige Bean nur an dieser Stelle verwendet wird, wird es direkt in der Eigenschaft eingebunden, ohne id.

<bean id="externalDocumentSource" class="com.infopark.pm.doc.FileDocumentSource">
  <property name="documentRoot"
    value="/opt/infopark/fiona/instance/default/export/online/docs"/>
  <property name="inputEncoding" value="UTF-8"/>
</bean>

<bean id="permissionManager" class="com.infopark.pm.doc.DocumentPermissionManager">
  <property name="documentSource" ref="externalDocumentSource"/>
  <property name="permissionReader">
    <bean class="com.infopark.pm.FionaPermissionReader"/>
  </property>
  <property name="permissionResolver">
    <bean class="com.infopark.pm.FionaPermissionResolver"/>
  </property>
</bean>

Die Eigenschaften eines Beans werden von der Klasse bestimmt. Um eine Eigenschaft setzen zu können, muss die Klasse eine öffentliche Methode haben, deren Name sich aus set und dem Namen der Eigenschaft zusammensetzt. Der Methode wird genau ein Argument übergeben, der Wert der Eigenschaft. Im obigen Beispiel wird die Methode setDocumentSource() der Klasse com.infopark.pm.doc.DocumentPermissionManager aufgerufen. Die öffentlichen Methoden der im Lieferumfang von CMS Fiona enthaltenen Java-Klassen können Sie der API-Dokumentation im Verzeichnis share/doc/javadoc/pm im Installationsverzeichnis des CMS entnehmen.

Hinweise zur Fehlersuche

Konfigurationsfehler führen dazu, dass die Web-Applikation sich nicht deployen lässt. Die Logdatei der betreffenden Web-Applikation gibt Auskunft über die Art des Fehlers. Bei solchen Fehlern tritt immer eine BeanDefinitionStoreException auf. Typische Gründe sind:

  • Line ... in XML document ... is invalid

    Die Konfigurationsdatei ist kein gültiges XML. Prüfen Sie die Datei auf syntaktische Richtigkeit.

  • Bean class [Klassenname] not found

    Die für das Bean als class angegebene Java-Klasse Klassenname ist unbekannt. Entweder ist der Klassenname falsch geschrieben, oder die Klasse ist nicht im Verzeichnis WEB-INF/classes oder in einem jar-Archiv unter WEB-INF/lib in der Web-Applikation zu finden.

  • Error setting property values

    Der Wert der Eigenschaft konnte nicht gesetzt werden. Sofern kein Schreibfehler vorliegt, ist die Methode möglicherweise nicht öffentlich (public) oder der Wert passt nicht zum Typ des Arguments der Methode.

  • Could not instantiate class [Klassenname]

    Die angegebene Java-Klasse Klassenname konnte zwar gefunden werden, es kann jedoch kein Objekt erzeugt werden. Möglicherweise muss eine von davon abgeleitete Klasse verwendet werden.