Wir haben eine Anwendung mit einem Plugin, das einen Dienst enthält:
public class TaskService {
public void doSomething( Task task ) {
// do something with task
task.save();
}
}
Das funktioniert gut.
Für unseren "besonderen" Kunden mit seinen speziellen Anforderungen haben wir eine zweite Anwendung, die das Plugin aus der ersten Anwendung enthält und ein weiteres Plugin mit einem speziellen Dienst für diesen Kunden, der den ursprünglichen Dienst erweitert und einige Methoden überschreibt:
public class SpecialTaskService extends TaskService{
@Override
public void doSomething( Task task ) {
// do something special with task
task.save();
}
}
An jeder Stelle in der zweiten Anwendung, wo taskService injiziert wird, wollen wir nun den SpecialTaskService haben (auch im Plugin der ersten Anwendung). Also haben wir den SpecialTaskService in der resources.groovy unter grails-app/conf/spring hinzugefügt:
beans = {
taskService( SpecialTaskService )
}
Aber jetzt erhalten wir eine HibernateException, wenn wir "task.save()" in dem speziellen Dienst aufrufen: org.hibernate.HibernateException: Es ist keine Hibernate-Sitzung an einen Thread gebunden, und die Konfiguration erlaubt es nicht, hier eine nicht-transaktionale Sitzung zu erstellen
Wir wissen, dass wir eine SessionFactory in den SpecialService einfügen können, aber wenn wir sessionFactory.currentSession aufrufen, erhalten wir dieselbe Exception.
Die Ausnahme tritt auch auf, wenn wir einen Dienst in resources.groovy konfigurieren, der keinen anderen Dienst erweitert.
Gibt es eine Möglichkeit, den speziellen Dienst eine Art von "hibernateSessionAware" zu machen, so dass wir save() und merge() auf Domänenobjekte aufrufen können?