This question has to do with several Spring technologies, but I think this is the most appropriate place to put it. I recently created a Spring Roo application. By default, the application is configured to use component scanning. Here is the original applicationContext.xml file.
I am planning on deploying the application to the Google App Engine. However, according to Google's documentation, you should turn of component scanning and use XML configuration so your application loads faster.Code:<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <context:property-placeholder location="classpath*:META-INF/spring/*.properties"/> <context:spring-configured/> <context:component-scan base-package="com.myproject"> <context:exclude-filter expression=".*_Roo_.*" type="regex"/> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="transactions-optional"/> </bean> </beans>
https://developers.google.com/appeng...g_optimization
Therefore, I commented out <context:component-scan /> from applicationContext-xml and added my beans. Here is the new applicationContext.xml file.
All of my services work fine. The problem is related to my entities. @PersistenceContext is no longer injecting an entityManager. Here is the basic pattern all of my entities use (created by Spring Roo)Code:<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> <context:property-placeholder location="classpath*:META-INF/spring/*.properties"/> <context:spring-configured/> <!-- <context:component-scan base-package="com.myproject"> <context:exclude-filter expression=".*_Roo_.*" type="regex"/> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan> --> <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" id="entityManagerFactory"> <property name="persistenceUnitName" value="transactions-optional"/> </bean> <bean id="myService" class="com.myproject.server.service.impl.MyServiceImpl" /> //additional service beans </beans>
If I set the entityManager by hand everything works fine. However, I would like to continue to use @PersistenceContext. It would seem as if this annotation was dependent on <context:component-scan />, but I can't fine anything in the documentation saying this is the case. In fact, the documentation implies <context:component-scan /> has nothing to do with @PersistenceContext. Am I missing something in my configuration file? Is it a limitation of GAE?Code:public class MyEntity { //private fields... } privileged aspect MyEntity_Roo_Jpa_ActiveRecord { @PersistenceContext transient EntityManager MyEntity.entityManager; public static final EntityManager MyEntity.entityManager() { EntityManager em = new Bid().entityManager; if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)"); return em; } //Data access methods.... } privileged aspect MyEntity_Roo_Jpa_Entity { declare @type: MyEntity: @Entity; //Spring Roo managed fields... } privileged aspect MyEntity_Roo_Configurable { declare @type: MyEntity: @Configurable; }


Reply With Quote
