Declarative Services - Nullpointer Exception

reach44

Mitglied
Hallo Leute,

habe hier ein Projekt laufen das aus verschiedenen OSGi-Bundles besteht. Die hier wichtigen 2 sind de.as.test.sensor und de.as.test.persistence

In ersterem habe ich die folgende vereinfacht dargestellte Klasse:

Java:
public class DataContainerDAO implements IPersistableDAO {
	
	private IDataBaseService dbService;
	
	
	public void bind(IDataBaseService dbService) {
		System.out.println("bind!: " +dbService);
		this.dbService = dbService;
	}
	
	public void unbind(IDataBaseService dbService) {
		System.out.println("unbind!: " +dbService);
		this.dbService = null;
	}

public void connect() {
dbService.openDBConnection();
}

und die Component-Definition, die auf den IDataBaseService referenziert:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" inmediate="true" name="de.hy.demounit.sensor.DataContainerDAO">
<implementation class="de.as.test.sensor.DataContainerDAO"/>
<reference bind="bind" cardinality="1..1" interface="de.as.test.persistence.services.IDataBaseService" name="IDataBaseService" policy="static" unbind="unbind"/>
</scr:component>[/XML]

Im 2.Bundle liegt jetzt das Interface IDataBaseService und dazu die Implementierung dessen.

Wenn ich jetzt meine Applikation starte gibt er mir die Ausgaben, aus der "bind"-Methode. Rufe ich jedoch später die connect()-Methode auf gibt er mir eine Nullpointer-Exception auf die Variable "dbService".

Weiß jemand was ich falsch mache? Da ja eigentlich das Binding einwandfrei funktioniert hat.
 

Wildcard

Top Contributor
Wenn ich jetzt meine Applikation starte gibt er mir die Ausgaben, aus der "bind"-Methode. Rufe ich jedoch später die connect()-Methode auf gibt er mir eine Nullpointer-Exception auf die Variable "dbService".
Bist du dir sicher das es sich in beiden Fällen um die gleiche Instanz von DataContainerDAO handelt?
 

reach44

Mitglied
Danke für die Antwort.

Du hast recht. Hab das überprüft und es sind 2 verschiedene Instanzen. Habe jetzt auch das Problem in meiner Logik gefunden.
Durch die bind/unbind Methoden und das inmediate="true" in der xml wird der IDataBaseService bei Beginn meiner Appliaktion gestartet. Später habe ich eine neue Instanz durch den new-Operator erstellt und somit natürlich keinen IDataBaseService gehabt.

Werde das Problem wohl mit einem schlichten ServiceTracker lösen.

Java:
ServiceTracker dataBaseServiceTracker = new ServiceTracker(Activator.getContext(), IDataBaseService.class, null);
dataBaseServiceTracker.open();
		
if(dataBaseServiceTracker.getService() instanceof IDataBaseService) {
	dbService = (IDataBaseService) dataBaseServiceTracker.getService();
}
 

Ähnliche Java Themen


Oben