Posts Tagged ‘AOP’
The prefix “tx” for element “tx:advice” is not bound
Error:
The prefix “tx” for element “tx:advice” is not bound
Story:
I was updating my code, to add in DB data insertion into 1 of my action class.
hit the above error “The prefix “tx” for element “tx:advice” is not bound”
From the error message, i think its complaining the missing of to define the schema location.
So, I add the schema location, and restart the tomcat…. eh, same error again?!
OK, i did a google and found out that, I not only missed to define the schema location;
I also forget to defind the “tx” header. (something like “tablib” in jsp).
So, I add in the following line “xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” and test again.
Wow, its working now!
Lessons Learned:
The root cause of this error is missing the “xmlns:tx” being defined in applicationContext.xml
Solution:
Final applicationContext.xml header:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
>
No Hibernate Session bound to thread
Problem:
I hit an error “No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here” while I’m doing unit testing in an application that combining Spring Batch and Hibernate. This problem exists when I try to do some data insertion at the Spring Batch Listener.
Solution:
The root of this problem occurred is because there is NO hibernate session at the Spring Batch Listener level. How come?!?! Its because the AOP pointcut I defined and use throughout the application is at the Batch JobRepository
<aop:config>
<aop:advisor pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"
advice-ref="txAdvice" />
</aop:config>
But the Batch Listener is not under the same / child package of the JobRepository. The Listener is under org.springframework.batch.core.StepExecutionListener. To ease the configuration, I add in another pointcut at my business package my.com.company.project.writer.MyItemWriter.beforeStep.
The AOP pointcut I added is:
<aop:config>
<aop:advisor pointcut="execution(* my.com.pv.batch.report.writer.CdrItemWriter.beforeStep(..))"
advice-ref="txAdvice" />
</aop:config>
Lessons Learned:
1. Identified where is the point cuts, is that the existing pointcut is enough for me?