I have defined a pointcut using the @Aspect annotation in my class.
I configure the pointcut using a custom annotation which I have defined in my context:
Unfortunately the entityManager inside buildDao is always null if I have a reference to buildDao in my pointcut.Code:<aop:aspectj-autoproxy proxy-target-class="true"/> <!-- Messaging pointcut --> <bean id="messagePointcut" class="com.adobe.codex.aspects.MessagePointcut" > <constructor-arg ref="msgPointcutEntityFactory"/> <property name="buildDao" ref="buildDao"/> </bean> <!-- enable our own annotation --> <aop:config proxy-target-class="true"> <aop:aspect ref="messagePointcut"> <aop:pointcut id="proxiedMethods" expression="@annotation(com.obade.codex.aspects.annotation.MessageGateway)"/> <aop:around pointcut-ref="proxiedMethods" method="interceptAnnotatedMethod"/> </aop:aspect> </aop:config>
Not sure what the best way to fix this would be.
I'm assuming the problem is that the weaving used (load time) is does not know how to create an entityManager from the entityManagerFactory bean.
here is a snippet of my dao context.
Here is my Pointcut:Code:<context:annotation-config /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaProperties"> <util:properties location="classpath:com/obade/codex/dao/jpa/hibernate.properties" /> </property> </bean> <bean id="buildDao" class="com.obade.codex.dao.jpa.JpaBuildDao"> <description> A DAO for Builds. </description> <property name="queryHelper" ref="queryHelper" /> <property name="partDao" ref="partDao" /> <property name="buildQueryFactory" ref="buildQueryFactory" /> </bean>
Code:@Aspect public class MessagePointcut implements Ordered, MsgObservable { private MsgPointcutEntityFactory msgEntityFactory; private BuildDao buildDao; public void setBuildDao(BuildDao buildDao) { this.buildDao = buildDao; } public MessagePointcut(MsgPointcutEntityFactory msgEntityFactory){ this.msgEntityFactory = msgEntityFactory; } public Object interceptAnnotatedMethod(ProceedingJoinPoint pjp) { Object returnedEntity = null; Object originalEntity = null; try { // // do stuff before executing the call originalEntity = msgEntityFactory.fetch(id, Build.class); //execute the call returnedEntity = pjp.proceed(); // do stuff after executing the call // ... } catch (Throwable e) { e.printStackTrace(); } return returnedEntity; } @Override public int getOrder() { return 2; } }
And a snippet of my dao
Code:@Repository public class JpaBuildDao implements BuildDao { private static final Log log = LogFactory.getLog(JpaBuildDao.class); @PersistenceContext private EntityManager entityManager; private QueryHelper queryHelper; private BuildQueryFactory standardQueryFactory; private PartDao partDao; public Build getFlatBuild(Integer id) { Build returnBuild; Query query = entityManager.createQuery( "SELECT b FROM Build b " + "WHERE " + "b.id = :id"); query.setParameter("id", id); returnBuild = (Build) query.getSingleResult(); return returnBuild; }


Reply With Quote