# GWT Spring JPA - DAO Injection



## MySelV (28. Mai 2010)

Hallo Community,

ich habe gerade ein Problem mit Dependency Injection in einem Projekt mit GWT ( + GIN für Frontend DI), Spring und JPA.

Ich hatte gehofft, dass folgende Konfiguration ausreichend ist, um meine DAO's per Spring in meine Handler am Server zu injizieren (DI für den EntityManager in die DAO's funktioniert) :

Spring:
[XML]  <context:annotation-config />
  <context:component-scan base-package="...test.server.dao" />
<context:component-scan base-package="...test.server.handler" />
[/XML]

BundesLandDaoImpl implements IBundesLandDao :

```
@Repository
public class BundesLandDaoImpl extends GenericDaoImpl<Bundesland, Long>
		implements IBundesLandDao {
	
}
```

Handler:

```
public class BundesLandHandler {

             @Resource
	private IBundesLandDao bundesLandDao;

             public void setBundesLandDao(IBundesLandDao bundesLandDao) {
		this.bundesLandDao = bundesLandDao;
	}

}
```

Leider funktioniert es so noch nicht ganz. Mein DAO wird nicht per DI hineingereicht.  Wenn zur Fehlersuche noch was fehlt, dann fragt einfach nach 

Viele Grüße
Erik


----------



## kidsos (28. Mai 2010)

Ich weiß jetzt nicht genau, was du bereits installiert hast. Aber ich habe dazu kürzlich einen Artikel gefunden, der genau die Integration von Spring, JPA in einem GWT-Projekt erläutert (siehe Link). Ich konnte es selber noch nicht testen, aber wenn es dort als funktionierend dargestellt wird, dürfte das auch auf dein Projekt übertragbar sein.

Hoffe, dass dir das hilft


----------



## MySelV (28. Mai 2010)

Leider noch nicht - habe jetzt bisschen umgestellt und werde nachfolgend mal meine kompletten Kofigurationen posten:

spring-dao.xml
[XML]
<context:annotation-config />
	<context:component-scan base-package="de.test.server.handler" />
	<context:component-scan base-package="de.test.server.mdata" />
	<context:component-scan base-package="de.test.server.dao">
		<context:include-filter type="annotation"
            expression="org.springframework.stereotype.Repository"/>
	</context:component-scan>

	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<!-- EntityManagerFactory -->
	<bean id="applEntityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="applDataSource" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
		</property>
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
				<prop key="hibernate.default_schema">public</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">validate</prop>
			</props>
		</property>
	</bean>

<tx:annotation-driven proxy-target-class="true"
		transaction-manager="txManager" />


	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="applEntityManagerFactory" />
		<property name="dataSource" ref="applDataSource" />
	</bean>


	<!-- Registrierung der DAOs -->

	<bean id="bundesLandHandler" class="de.test.server.handler.BundesLandHandler" >
		<property name="bundesLandDao" ref="bundesLandDao" ></property>
	</bean>[/XML]

GenericDaoImpl:

```
public class GenericDaoImpl<T, K> extends JpaDaoSupport implements GenericDao<T, K> {
	
	private static final Logger LOG = Logger.getLogger(GenericDaoImpl.class);
	
	@Override
	public Boolean delete(T entity) {
		try {
			getJpaTemplate().remove(entity);
			return true;
		} catch (Exception e) {
			LOG.error("Fehler beim Speichern des Objekts " + entity, e);
		}
		return false;
	}
...
```

BundesLandDaoImpl:

```
@Repository("bundesLandDao")
public class BundesLandDaoImpl extends GenericDaoImpl<Bundesland, Long>
		implements IBundesLandDao {
	
}
```

BundesLandHandler:

```
public class BundesLandHandler implements ActionHandler<BundesLandAction, BundesLandResult> {

	private static final Logger LOG = Logger.getLogger(BundesLandHandler.class);
	
	@Autowired
	private IBundesLandDao bundesLandDao;
	
	public BundesLandHandler() {
		
	}
public void setBundesLandDao(IBundesLandDao bundesLandDao) {
		this.bundesLandDao = bundesLandDao;
	}
```

Es funktioniert lediglich das Setzen des DAO's im Handler per DI nicht.
Wahrscheinlich liegt der Fehler wieder in einem kleinen Buchstaben von Spring. Achso hier noch kurz meine Dependencies der pom, die Spring und JPA betreffen:

pom.xml
[XML]<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.3.2.GA</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-annotations</artifactId>
			<version>3.4.0.GA</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>3.4.0.GA</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>3.0.1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>2.5.6</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>2.5.6</version>
		</dependency>[/XML]

Was vielleicht schon hilfreich wäre, ist Spring Support in der eclipse IDE.. also auch, dass man z.B. wie bei STS ein Rechtsklick auf das Projekt machen kann und die Spring Project Nature hinzufügen kann.

VG
Erik


----------



## Noctarius (28. Mai 2010)

Brauch das GIN nicht einen eigenen Converter um das DI als JS Code abzubilden?


----------



## MySelV (28. Mai 2010)

Das ist richtig, da aber der Spring Context und die DAO's / Handler nur im Server existieren, dürfte das doch nichts machen oder? Der Code wird ja nicht in JS übersetzt. Ich bekomme übrigens mit der Konfiguration keine Fehlermeldung. Weder von GWT noch von Spring oder JPA


----------



## Noctarius (28. Mai 2010)

Wie holst du dir denn deinen BundeslandHandler?


----------



## MySelV (28. Mai 2010)

Per Callback über ein Event nach dem Observer Pattern - aber ja alles serverseitig. Worauf willst du hinaus?


----------



## Noctarius (28. Mai 2010)

Holst du es aus dem ApplicationContext oder instanzierst du es per new? Bei letzterem wird selbstverständlich nicht injected.


----------



## MySelV (28. Mai 2010)

Ah! *schnell mal vom Schlauch runtergeh*  Danke schonmal für den Hinweis.
Hmm könnte ich das umgehen, indem ich den Handler im Context als Bean registriere und ihm als property den Dao mitgebe?

Habe das gerade mal probiert via

[XML]
<bean id="bundesLandHandler" class="de.test.server.handler.BundesLandHandler">
   <property name="bundesLandDao" ref="bundesLandDao" />
</bean>
[/XML]

So funktionierts leider auch noch nicht. Oder geht das noch anders?

Gruß Erik


----------



## Noctarius (28. Mai 2010)

Du musst dir eine Instanz aus dem App Context besorgen und damit arbeiten.


----------



## MySelV (29. Mai 2010)

Hmm mein Handler hat die Annotation @Component, weshalb ich davon ausging, dass Spring da auch DI ausführen kann.

Muss ich dann über ClassPathXmlApplicationContext.getBean() meinen Handler laden? Oder wie müsste das aussehen?

Gruß


----------



## Noctarius (30. Mai 2010)

Z.B. Component heißt nur, das Spring diese Klasse automatisch innerhalb des AppContextes kennt. Außerhalb macht Spring garnichts automatisch, da sich der new-Operator nicht überschreiben lässt.


----------



## MySelV (31. Mai 2010)

DI funktionierte schon. Ich sollte nicht auf obj == null prüfen, wenn Spring die Objekte erst injiziert, wenn sie auch benötigt werden :rtfm:

Kann damit zu und danke für die Hilfe


----------

