首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring problem AspectJ中使用Ajc编译器

在Spring problem AspectJ中使用Ajc编译器
EN

Stack Overflow用户
提问于 2011-05-04 16:22:17
回答 1查看 1.2K关注 0票数 1

当我尝试用ajc编译器用spring编写aspectj时,我得到了下面的errror.when,我删除了aspectj,然后代码工作得很好,是不是有什么编译时的编织导致了问题

代码语言:javascript
复制
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文件

代码语言:javascript
复制
<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>
代码语言:javascript
复制
                                        classpath:/resources/hibernate-mappings                                                                                         
代码语言:javascript
复制
<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>

日志方面代码

代码语言:javascript
复制
  @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()));

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-04 19:40:17

在不知道哪一行是76行的情况下是很困难的:

代码语言:javascript
复制
at com.cdf.dfdxc.aspect.logging.LoggingAspect.logEntry(LoggingAspect.java:76)

但是您使用的是一个非常激进的切入点

代码语言:javascript
复制
@Pointcut("within(com.csc.exceed.uow.*)")
public void loggingAspect() {}

这将匹配所有类型的事件,不仅是方法执行,还包括静态和实例初始化器、字段访问等(请参阅AspectJ Quick Reference中的原语切入点概述)。

如果出现以下任一情况:

  • joinPoint.getTarget()返回null,则此行将抛出NPE:

Class<?扩展clazz = joinPoint.getTarget().getClass();

  • returns null Object> joinPoint.getSignature(),此行将抛出NPE:

String name = joinPoint.getSignature().getName();

  • Also,在这里,您将检查是否有null或空参数:

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

但是您仍然在使用args:

clazz(clazz,joinPoint.getArgs();

这也可能引发NPE,具体取决于constructArgumentsString()中的代码。

检查第76行发生了哪种情况,您就有了失败的候选者。但我的第一个提示是用executioncall切入点替换您积极的通用切入点。

我将使用一个组合的切入点,以模块化的方式定义:

代码语言:javascript
复制
// 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安全的方法:

代码语言:javascript
复制
Class<?> clazz = joinPoint.getTarget() !=null 
               ? joinPoint.getTarget().getClass() 
               : null;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5880552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档