问题
when i am trying to aspectj with spring using ajc compiler ,i am getting following errror.when i am removing aspectj then code is working fine is there anything with the compile time weaving which is causing problem
caused by: java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
... 31 more
Caused by: java.lang.NullPointerException
at com.cdf.dfdxc.aspect.logging.LoggingAspect.logEntry(LoggingAspect.java:76)
at com.cdfc.fdged.uow.UdfdFactory.<clinit>(UOWfdy.java:1)
Spring bean file
<bean id="hibernateCertificateDao" class="com.Add.exasmple2.dao.HibernateCertificateDaoImpl" autowire="byType">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<bean id="AddCert" class="com.Add.exasmple2.uow.AddCertUOW" lazy-init="true" autowire="byType">
<constructor-arg ref="oXMapper"></constructor-arg>
</bean>
<bean id="uOWFactoryBean" class="com.Add.exasmple2.uow.UOWFactory" />
<bean id="businessProcessManager" class="com.Add.exasmple2.infrastructure.BusinessProcessManager"></bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" >
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
classpath:/resources/hibernate-mappings
<bean id="exampleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.ibm.db2.jcc.DB2Driver</value>
</property>
<property name="url">
<value>jdbc:db2://20.15.29.108:50001/XC128086</value>
</property>
<property name="password">
<value>db2dut$</value>
</property>
<property name="username">
<value>db2dut</value>
</property>
</bean>
<bean id="exampleHibernateProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext
</prop>
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider
</prop>
<prop key="c3p0.acquire_increment">3</prop>
<prop key="c3p0.max_size">30</prop>
<prop key="c3p0.min_size">3</prop>
<prop key="c3p0.max_statements">0</prop>
<prop key="c3p0.idle_test_period">0</prop>
<prop key="c3p0.timeout">0</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
<prop key="connection.autocommit">true</prop>
<prop key="show_sql">false</prop>
<prop key="format_sql">false</prop>
<prop key="use_sql_comments">false</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
logging aspect code
@Pointcut("within(com.csc.exceed.uow.*)")
public void loggingAspect() {
}
// invoked before the method execution
@Before("loggingAspect()")
public void logEntry(JoinPoint joinPoint) {
Class<? extends Object> clazz = joinPoint.getTarget().getClass();
String name = joinPoint.getSignature().getName();
if (ArrayUtils.isEmpty(joinPoint.getArgs())) {
if (!(name.startsWith("get")) || (name.startsWith("set")))
logger.log(LogLevel.INFO, clazz, null, BEFORE_STRING, name,
constructArgumentsString(clazz, joinPoint.getArgs()));
} else {
logger.log(LogLevel.INFO, clazz, null, BEFORE_WITH_PARAMS_STRING,
name, constructArgumentsString(clazz, joinPoint.getArgs()));
}
}
回答1:
It's difficult without knowing which line 76 is:
at com.cdf.dfdxc.aspect.logging.LoggingAspect.logEntry(LoggingAspect.java:76)
but you are using a very aggressive pointcut
@Pointcut("within(com.csc.exceed.uow.*)")
public void loggingAspect() {}
This matches all kinds of events, not only method executions, but also static and instance inititializers, field access etc. (see the Primitive Pointcuts overview in the AspectJ Quick Reference).
If any of these:
returns
null
forjoinPoint.getTarget()
, this line will throw a NPE:Class<? extends Object> clazz = joinPoint.getTarget().getClass();
returns
null
forjoinPoint.getSignature()
, this line will throw a NPE:String name = joinPoint.getSignature().getName();
Also, here you are checking for null or empty args:
if (ArrayUtils.isEmpty(joinPoint.getArgs())) { if (!(name.startsWith("get")) || (name.startsWith("set"))) logger.log(LogLevel.INFO, clazz, null, BEFORE_STRING, name,
but you are using the args nevertheless:
constructArgumentsString(clazz, joinPoint.getArgs()));
This might also throw a NPE, depending on the code in
constructArgumentsString()
Check which of these happens on line 76, and you have your candidate for failure. But my first hint would be to replace your aggressive catch-all pointcut with an execution
or call
pointcut.
I would use a combined pointcut, defined in a modular way:
// you can easily reuse this
@Pointcut("within(com.csc.exceed.uow.*)")
public void myApp() {}
// and this
@Pointcut("execution(* *.*(..))")
public void methodExecution(){}
// but this is the pointcut you are actually matching
@Pointcut("myApp() && methodExecution()")
public void methodExecutionInMyApp(){}
@Before("methodExecutionInMyApp()")
public void logMethodExecutions(JoinPoint jp){
// your code here
}
Here's how to make the class thingy NPE-safe:
Class<?> clazz = joinPoint.getTarget() !=null
? joinPoint.getTarget().getClass()
: null;
来源:https://stackoverflow.com/questions/5880552/using-ajc-compiler-with-spring-problem-aspectj