GWT Spring JPA - DAO Injection

MySelV

Aktives Mitglied
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 :
Java:
@Repository
public class BundesLandDaoImpl extends GenericDaoImpl<Bundesland, Long>
		implements IBundesLandDao {
	
}

Handler:
Java:
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
 
Zuletzt bearbeitet:
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 🙂
 
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:
Java:
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:
Java:
@Repository("bundesLandDao")
public class BundesLandDaoImpl extends GenericDaoImpl<Bundesland, Long>
		implements IBundesLandDao {
	
}

BundesLandHandler:
Java:
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
 
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
 
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
 
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ß
 
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.
 
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
 

Zurück
Oben