当我尝试使用 ajc 编译器对 spring 进行切面时,出现以下错误。当我删除切面时,代码工作正常 编译时编织是否有任何问题导致问题
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 文件
<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>
类路径:/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>
记录方面代码
@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()));
}
}
最佳答案
如果不知道第 76 行是哪一行,就很难了:
at com.cdf.dfdxc.aspect.logging.LoggingAspect.logEntry(LoggingAspect.java:76)
但是你使用了非常激进的切入点
@Pointcut("within(com.csc.exceed.uow.*)")
public void loggingAspect() {}
这匹配所有类型的事件,不仅是方法执行,还包括静态和实例初始化程序、字段访问等(请参阅 AspectJ Quick Reference 中的原始切入点概述)。
如果有以下任何一个:
对于
joinPoint.getTarget()
返回null
,此行将抛出NPE:Class<? extends Object> clazz = joinPoint.getTarget().getClass();
对于
joinPoint.getSignature()
返回null
,此行将抛出NPE:String name = joinPoint.getSignature().getName();
此外,您还要检查 null 或空参数:
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()));
这也可能引发 NPE,具体取决于
constructArgumentsString()
中的代码
检查第 76 行发生了哪些情况,您就确定了失败的可能性。但我的第一个提示是用 execution
或 call
切入点替换激进的包罗万象的切入点。
我将使用以模块化方式定义的组合切入点:
// 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
}
<小时/>
以下是如何使类事物 NPE 安全:
Class<?> clazz = joinPoint.getTarget() !=null
? joinPoint.getTarget().getClass()
: null;
关于java - 使用Ajc编译器和Spring问题AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5880552/