使用Ajc编译器与Spring问题AspectJ [英] Using Ajc compiler with Spring problem AspectJ

查看:184
本文介绍了使用Ajc编译器与Spring问题AspectJ的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试使用ajc编译器弹出aspectj时,我得到以下错误。当我删除aspectj然后代码工作正常
是否有编译时编织导致问题



由于: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(AbstractAutowireCapableBeanFa) ctory.java:877)
... 31更多
引起: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 =hibernateCertificateDaoclass =com.Add.exasmple2.dao.HibernateCertificateDaoImplautowire =byType> 
< property name =hibernateTemplate>
< ref bean =hibernateTemplate/>
< / property>
< / bean>

< bean id =AddCertclass =com.Add.exasmple2.uow.AddCertUOWlazy-init =trueautowire =byType>
< constructor-arg ref =oXMapper>< / constructor-arg>
< / bean>

< bean id =uOWFactoryBeanclass =com.Add.exasmple2.uow.UOWFactory/>

< bean id =businessProcessManagerclass =com.Add.exasmple2.infrastructure.BusinessProcessManager>< / bean>

< bean id =hibernateTemplateclass =org.springframework.orm.hibernate3.HibernateTemplate>
< property name =sessionFactory>
< ref bean =sessionFactory/>
< / property>
< / bean>





classpath:/ resources / hibernate-mappings








 < bean id =exampleDataSourceclass =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(){

}

//在方法执行之前调用
@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快速参考中的原始切入点概述)。



如果有以下任何一项:




  • 返回 null 对于 joinPoint.getTarget(),此行将抛出一个NPE:

     类< ;? extends Object> clazz = joinPoint.getTarget()。getClass(); 


  • 为<$返回 null c $ c> joinPoint.getSignature(),此行将抛出一个NPE:

     字符串名称= joinPoint.getSignature()。getName(); 


  • 此外,您在这里检查空或空args:

      if(ArrayUtils.isEmpty(joinPoint.getArgs())){
    if(!(name.startsWith(get))| |(name.startsWith(set)))
    logger.log(LogLevel.INFO,clazz,null,BEFORE_STRING,name,

    但你仍在使用args:

      constructArgumentsString(clazz,joinPoint.getArgs ())); 

    这也可能会抛出一个NPE,具体取决于 constructArgumentsString()中的代码




检查第76行中发生了哪些,并且您的候选人失败了。但我的第一个提示是用执行调用切入点替换你积极的全能切入点。



我会使用以模块化方式定义的组合切入点:

  / /你可以很容易地重复使用这个
@Pointcut(在(com.csc.exceed.uow。*))
public void myApp(){}

//和这个
@Pointcut(execution(* *。*(..)))
public void methodExecution(){}

//但这是你的切入点实际匹配
@Pointcut(myApp()&& methodExecution())
public void methodExecutionInMyApp(){}

@Before(methodExecutionInMyApp())
public void logMethodExecutions(JoinPoint jp){
//您的代码在这里
}






以下是如何使课堂内容符合NPE安全:

 类<?> clazz = joinPoint.getTarget()!= null 
? joinPoint.getTarget()。getClass()
:null;


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()));

    }
}

解决方案

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 for joinPoint.getTarget(), this line will throw a NPE:

    Class<? extends Object> clazz = joinPoint.getTarget().getClass();
    

  • returns null for joinPoint.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;

这篇关于使用Ajc编译器与Spring问题AspectJ的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆