Ich habe ein neues Java-Projekt, indem ich Hibernate zum ersten mal mit Spring und Jasypt einsetze. Spring und Hibernate dürften eher bekanntere Begriffe aus der Javawelt sein, so dass ich nur kurz erwähnen möchte, was Jasypt ist.

Jasypt steht für Java simplified encryption und bietet dem Entwickler bei kombiniertem Einsatz mit Hibernate eine für die Businesslogik transparente Verschlüsselung von zu persitierenden Daten.

Ich habe versucht, der Anleitung zum Einsatz von Jasypt mit Hibernate 3 zu folgen, erhiel aber immer wieder die folgende EncryptionInitializationException:

Exception in thread "main" org.jasypt.exceptions.EncryptionInitializationException: No string encryptor registered for hibernate with name "strongHibernateStringEncryptor"
at org.jasypt.hibernate.type.AbstractEncryptedAsStringType.checkInitialization(AbstractEncryptedAsStringType.java:250)
at ...

Nachdem ich mehrere Stunden verzweifelt nach der Ursache und meinem Fehler gesucht habe – mittels Google und Try’n’Error – bin ich auf einen Beitrag gestoßen, der mich schließlich auf die Lösung gebracht hat.

Nach einer kleinen aber wirkungsvolle Änderung in meiner Spring-Konfigurationsdatei applicationContext.xml (depends-on=”hibernateStringEncryptor” in der markierten Zeile) war der Fehler behoben …

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                      http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

  <bean id="strongEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="algorithm">
      <value>PBEWithMD5AndDES</value>
    </property>
    <property name="password">
       <value>xJxAxSxYxPxTx</value>
    </property>
  </bean>

  <bean id="hibernateStringEncryptor" class="org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor">
    <property name="registeredName">
      <value>strongHibernateStringEncryptor</value>
    </property>
    <property name="encryptor">
      <ref bean=”strongEncryptor” />
    </property>
  </bean>

  <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydatabase" />
    <property name="user" value="myusername" />
    <property name="password" value="mysecretpassword" />
    <property name="minPoolSize" value="2" />
    <property name="maxPoolSize" value="4" />
  </bean>

  <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" depends-on="hibernateStringEncryptor">
    <property name="dataSource" ref="datasource" />
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
  </bean>

  <bean id="myService" class="tld.domain.service.MyServiceImpl">
    <property name="myBusinessObjectDao" ref="businessObjectDao" />
  </bean>

  <bean id="businessObjectDao" class="tld.domain.persistence.BusinessObjectDaoImpl">
    <constructor-arg ref="hibernateSessionFactory" />
  </bean>

  <!–- Transaction handling -–>

  <tx:annotation-driven transaction-manager="txManager" />

  <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="hibernateSessionFactory" />
  </bean>