最近在项目中遇到一个问题,项目启动自动为标注了@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;
}
更深层次的原因还没有去找,留个记录,后续查找具体原因!