jdk动态代理和cglib动态代理的冲突(可能)

原创
2016/09/24 10:56
阅读数 578

最近在项目中遇到一个问题,项目启动自动为标注了@Log和@Rollback的类生成代理(项目采用jersey+spring+mybatis的方式进行搭建),没有采用配置的方式进行代理创建(配置的方式需要一定规则,比如方法名规范或者配置很多的ProxyFactoryBean,都很麻烦),而是采用BeanPostProcessor的方式进行自动创建,问题来了:@Log的创建方式采用cglib进行创建,@Rollback采用jdk动态代理创建,项目运行正常,没有任何问题,当我在代理类的方法中(@Log和@Rollback都是类级注解)添加@Valid注解的时候,此注解没有采用ProxyFactoryBean进行创建,而是直接采用aspect创建的前置增强,项目正常启动,访问method,出现问题了:java.lang.IllegalArgumentException: object is not an instance of declaring class,jersey包装之后的异常:javax.ws.rs.ProcessingException: Resource Java method invocation error。当我都使用cglib进行代理创建的时候,问题解决。代码如下:

@Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        try {
            Object proxyTarget = ReflectUtils.getProxyOriginInstance(bean);
            Class<?> proxyTargetClass = proxyTarget.getClass();

            if (proxyTargetClass == LogProxyCreator.class) {
                return bean;
            }
            
            if (ReflectUtils.hasAnnotation(Log.class, proxyTargetClass)) {

                ProxyFactoryBean proxy = new ProxyFactoryBean();
                proxy.setBeanFactory(factory);
                proxy.setProxyTargetClass(true);//就是这个设置
                proxy.setInterfaces(proxyTargetClass.getInterfaces());
                proxy.setTarget(bean);
                proxy.setInterceptorNames("logInterceptor");

                return proxy.getObject();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }

更深层次的原因还没有去找,留个记录,后续查找具体原因!

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部