# Declarative Services - Nullpointer Exception



## reach44 (18. Okt 2011)

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:


```
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 (19. Okt 2011)

> 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 (20. Okt 2011)

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.


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


----------

