Using Ajc compiler with Spring problem AspectJ

泪湿孤枕 提交于 2019-12-02 13:52:09

问题


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


来源:https://stackoverflow.com/questions/5880552/using-ajc-compiler-with-spring-problem-aspectj

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!