简体   繁体   English

Spring AOP:AopConfigException:无法生成类的CGLIB子类

[英]Spring AOP: AopConfigException: Could not generate CGLIB subclass of class

Below is my LoggingAspect.java 下面是我的LoggingAspect.java

import java.util.logging.Level;
import java.util.logging.Logger;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class LoggingAspect {

    private static Logger logger = Logger.getLogger(LoggingAspect.class.getName());
    private static final String ENTERING = "(AOP) Entering ";
    private static final String EXITING = "(AOP) Exiting ";
    private static final String RETURNING = "(AOP) Returning for class ";
    private static final String EXCEPTION = "(AOP): Exception ";

    @Pointcut("execution(* com.adminserver..*(..)) && " + "!within(is(EnumType)) && " + "!within(is(FinalType))")
    protected void loggingOperation() {
        // intentionally left blank
    }

    private String getArguments(Object[] obj) {
        String str = "{";
        for (int i = 0; i < obj.length && obj[i] != null; i++)
            str += obj[i].toString() + ",";
        str += "}";
        return str;
    }

    @Before("loggingOperation()")
    public void logEntry(final JoinPoint joinPoint) {
        String msg = ENTERING + joinPoint.getTarget().getClass().getName() + " " + joinPoint.getSignature().getName()
                + " Arguments: " + getArguments(joinPoint.getArgs());

        logger.log(Level.INFO, msg);

    }

    @After("loggingOperation()")
    public void logExit(final JoinPoint joinPoint) {
        logger.log(Level.INFO, EXITING + joinPoint.getTarget().getClass().getName() + " "
                + joinPoint.getSignature().getName() + " Arguments:" + getArguments(joinPoint.getArgs()));
    }

    @AfterReturning(pointcut = "loggingOperation()", returning = "result")
    public void logReturn(final JoinPoint joinPoint, Object result) {
        String msg = RETURNING + joinPoint.getTarget().getClass().getName() + ", Method: "
                + joinPoint.getSignature().getName() + " Return Value: ";
        if (result != null)
            logger.log(Level.INFO, msg + result.toString());
        else
            logger.log(Level.INFO, msg + "NULL");

    }

    @AfterThrowing(pointcut = "loggingOperation()", throwing = "ex")
    public void logException(JoinPoint joinPoint, Throwable ex) throws Throwable {
        String msg = EXCEPTION + joinPoint.getTarget().getClass().getName() + " " + joinPoint.getSignature().getName();
        logger.log(Level.SEVERE, msg, ex);
    }

}

Tried with both of the below config (after searching for answers on SO): 尝试使用以下两个配置(在SO上搜索答案后):

<aop:aspectj-autoproxy proxy-target-class="true"/> and <aop:aspectj-autoproxy proxy-target-class="false"/> <aop:aspectj-autoproxy proxy-target-class="true"/><aop:aspectj-autoproxy proxy-target-class="false"/>

Application is running and it is working as expected for some part of the code. 应用程序正在运行,并且按部分代码预期的那样工作。 but for some of the other parts of the it is throwing something like this: 但是对于其他部分,它会抛出如下所示的信息:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'onLoadProcessor_PolicyOverviewScreen_b155c215e3379a2caad2916f665ce44': Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.adminserver.sre.bll.generatedClasses.OnLoadProcessor_PolicyOverviewScreen_b155c215e3379a2caad2916f665ce44]: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1078)
    at com.adminserver.utl.SpringBeanUtl.getBean(SpringBeanUtl.java:55)
    at com.adminserver.sre.helper.generator.OnLoadGenerator.generate(OnLoadGenerator.java:109)
    at com.adminserver.sre.helper.generator.OnLoadGenerator.getOnLoadProcessorBll(OnLoadGenerator.java:58)
    at com.adminserver.sre.helper.generator.OnLoadGenerator.getOnLoadProcessorBllForProcessing(OnLoadGenerator.java:35)
    at com.adminserver.sre.bll.ScreenEventBll.processLoad(ScreenEventBll.java:130)
    ... 124 more
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.adminserver.sre.bll.generatedClasses.OnLoadProcessor_PolicyOver+viewScreen_b155c215e3379a2caad2916f665ce44]: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:469)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:349)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1633)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    ... 135 more
Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:492)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
    at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
    at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:337)
    at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:55)
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:201)
    ... 142 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:459)
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336)
    ... 155 more
Caused by: java.lang.NoClassDefFoundError: com/adminserver/sre/bll/generatedClasses/OnLoadProcessor_PolicyOverviewScreen_b155c215e3379a2caad2916f665ce44
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    ... 160 more
Caused by: java.lang.ClassNotFoundException: com.adminserver.sre.bll.generatedClasses.OnLoadProcessor_PolicyOverviewScreen_b155c215e3379a2caad2916f665ce44
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
    ... 162 more

lib used: 使用的lib:

<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.10</version>
</dependency>

As you can see I am excluding all the enum types and final classes by using 如您所见,我通过使用排除所有枚举类型和最终类

@Pointcut("execution(* com.adminserver..*(..)) && " + "!within(is(EnumType)) && " + "!within(is(FinalType))")

but in the log it still complains for Common causes of this problem include using a final class or a non-visible class; 但在日志中,它仍然抱怨Common causes of this problem include using a final class or a non-visible class;

Added !within(com.adminserver..*.generatedClasses..*) in the pointcut expression and it worked. 在切入点表达式中添加了!within(com.adminserver..*.generatedClasses..*) ,它可以正常工作。

Below is the complete expression. 下面是完整的表达。

@Pointcut("execution(public * com.adminserver..*(..)) && " + "!within(is(EnumType)) && " + "!within(is(FinalType)) && "+"!within(com.adminserver..*.generatedClasses..*)")
    protected void loggingOperation() {
        // intentionally left blank
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM