0

我们正在将一些批处理作业从 Spring XD M5 移至 1.0.0 版本。

在创建和部署作业时,我们在自动装配 Spring Data 存储库(在本例中为 Neo4J)时遇到了 cglib 代理功能的问题。

堆栈跟踪的尾部:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'datasetRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class
 com.sun.proxy.$Proxy112]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy112
        at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1512)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:313)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
        ... 54 more
Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy112]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final
 class class com.sun.proxy.$Proxy112
        at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212)
        at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:494)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:379)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:339)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:421)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1698)
        at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:113)
        ... 61 more
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy112
        at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
        at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
        at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
        at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
        at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
        at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
        at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57)
        at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:202)
        ... 68 more

Spring Data repository 接口注释@Repository如下:

@Repository
public interface DatasetRepository extends GraphRepository<Dataset> 
{
    public Dataset findOneById(String id);
    public Dataset findOneByName(String name);
}

以及触发异常的 bean 类中相应的 autowired 属性:

    @Autowired
    private DatasetRepository datasetRepo;

bean 本身在我们的 XD 作业 XML 中定义如下:

<bean id="myBean" class="com.mycompany.MyBean"/>

以及配置 bean(在作业 cfg XML 中扫描的组件):

@Configuration
@EnableNeo4jRepositories({ "com.mycompany.repositories" })
public class CustomNeo4jConfiguration implements InitializingBean

我们部署到 XD lib 文件夹中的 Spring Data Neo4J 版本如下:

spring-data-neo4j      : 3.2.0.RELEASE
spring-data-neo4j-rest : 3.2.0.RELEASE

设置全部在开发 PC 上(目前),XD 在分布式模式下运行:

  • redis 服务器
  • Zookeeper 服务器 (1x)
  • Oracle 作业存储库(目前为本地 XE 实例)
  • 1x 管理员和 1x 容器

任何有关作业配置、Spring Data 存储库或 XD 容器的帮助将不胜感激。

谢谢

4

1 回答 1

0

删除 GraphRepository 上的 @Repository 注释,你应该没问题。不要忘记启用组件扫描。

于 2015-11-20T09:08:07.197 回答