代码之家  ›  专栏  ›  技术社区  ›  Steven Gall

GraphQueryLookupStrategy。resolveQuery从SDN 4.0迁移到SDN 4.1.RC1时出现异常

  •  2
  • Steven Gall  · 技术社区  · 9 年前

    我正在迁移应用程序以使用SDN 4.1.0.RC1,但在尝试启动应用程序后遇到了一些问题。我已经进行了必要的配置更改,以正确地将HTTPDriver用于我的远程服务器(localhost:7474)。当启动应用程序时,我在尝试加载spring上下文时,我的一个存储库中出现了以下错误。

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.data.neo4j.repository.query.GraphQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery;
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        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.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
        ... 32 common frames omitted
    Caused by: java.lang.AbstractMethodError: org.springframework.data.neo4j.repository.query.GraphQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery;
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:416)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:206)
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251)
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237)
        at org.springframework.data.neo4j.repository.support.GraphRepositoryFactoryBean.afterPropertiesSet(GraphRepositoryFactoryBean.java:43)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        ... 42 common frames omitted
    

    这是似乎在哭泣的香草仓库

    @Repository
    public interface UserRepository extends GraphRepository<User> {
    
      @Query("MATCH (u:User) where u.authId = {authId} return u limit 1")
      User findOneByAuthId(@Param("authId") Long authId);
    
    }
    

    编辑

    看起来这可能是弹簧数据版本和弹簧数据neo4j之间的断开。

    有问题的GraphQueryLookupStrategy。。。

    /*
     * Copyright (c)  [2011-2016] "Pivotal Software, Inc." / "Neo Technology" / "Graph Aware Ltd."
     *
     * This product is licensed to you under the Apache License, Version 2.0 (the "License").
     * You may not use this product except in compliance with the License.
     *
     * This product may include a number of subcomponents with
     * separate copyright notices and license terms. Your use of the source
     * code for these subcomponents is subject to the terms and
     * conditions of the subcomponent's license, as noted in the LICENSE file.
     *
     */
    
    package org.springframework.data.neo4j.repository.query;
    
    import org.neo4j.ogm.session.Session;
    import org.springframework.data.projection.ProjectionFactory;
    import org.springframework.data.repository.core.NamedQueries;
    import org.springframework.data.repository.core.RepositoryMetadata;
    import org.springframework.data.repository.query.QueryLookupStrategy;
    import org.springframework.data.repository.query.RepositoryQuery;
    
    import java.lang.reflect.Method;
    
    /**
     * @author Mark Angrish
     * @author Luanne Misquitta
     * @author Oliver Gierke
     */
    public class GraphQueryLookupStrategy implements QueryLookupStrategy {
    
        private final Session session;
    
        public GraphQueryLookupStrategy(Session session) {
            this.session = session;
        }
    
        /* 
         * (non-Javadoc)
         * @see org.springframework.data.repository.query.QueryLookupStrategy#resolveQuery(java.lang.reflect.Method, org.springframework.data.repository.core.RepositoryMetadata, org.springframework.data.projection.ProjectionFactory, org.springframework.data.repository.core.NamedQueries)
         */
        @Override
        public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, ProjectionFactory factory,
            NamedQueries namedQueries) {
            return new GraphQueryMethod(method, metadata, factory, session).createQuery();
        }
    }
    

    看来我的QueryLookupStrategy需要一个方法 RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, NamedQueries namedQueries); 显然不是这样。我假设这现在是一个依赖性问题,并将进一步调查我需要符合SDN的Spring Data版本

    /*
     * Copyright 2008-2010 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.springframework.data.repository.query;
    
    import java.lang.reflect.Method;
    import java.util.Locale;
    
    import org.springframework.data.repository.core.NamedQueries;
    import org.springframework.data.repository.core.RepositoryMetadata;
    import org.springframework.util.StringUtils;
    
    /**
     * Strategy interface for which way to lookup {@link RepositoryQuery}s.
     * 
     * @author Oliver Gierke
     */
    public interface QueryLookupStrategy {
    
        public static enum Key {
    
            CREATE, USE_DECLARED_QUERY, CREATE_IF_NOT_FOUND;
    
            /**
             * Returns a strategy key from the given XML value.
             * 
             * @param xml
             * @return a strategy key from the given XML value
             */
            public static Key create(String xml) {
    
                if (!StringUtils.hasText(xml)) {
                    return null;
                }
    
                return valueOf(xml.toUpperCase(Locale.US).replace("-", "_"));
            }
        }
    
        /**
         * Resolves a {@link RepositoryQuery} from the given {@link QueryMethod} that can be executed afterwards.
         * 
         * @param method
         * @param metadata
         * @param namedQueries
         * @return
         */
        RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, NamedQueries namedQueries);
    }
    
    2 回复  |  直到 9 年前
        1
  •  6
  •   Steven Gall    9 年前

    好吧,如果你遇到这个问题,有一个非常直接的解决方法。请参阅文档 http://projects.spring.io/spring-data/ 。此异常是由与spring data commons模块的版本冲突引起的。neo4j在4.1.0.RC1版本中实现的接口已更改,因此引发了此异常。

    要解决问题,请使用Spring Data发布列车BOM,并将其设置为发布Hopper-RC1。由于我使用gradle,说明如下,但您也可以在上面的链接中找到它们。

    相关生成脚本已简化。。。

    buildscript {
      dependencies {
        classpath "io.spring.gradle:dependency-management-plugin:0.4.0.RELEASE"
      }
    }
    
    apply plugin: "io.spring.dependency-management"
    
    dependencyManagement {
      imports {
        mavenBom 'org.springframework.data:spring-data-releasetrain:Hopper-RC1'
      }
    }
    
    dependencies {
        compile 'org.springframework.data:spring-data-neo4j:4.1.0.RC1'
    }repositories {
        maven {
            url 'https://repo.spring.io/libs-milestone'
        }
    }
    

    干杯

    史蒂夫

        2
  •  2
  •   Jack Dalton    9 年前

    扩展@Holycowzer对Maven用户的回答。将以下行添加到构建POM.xml中。请注意,这是将坐在你的主要 <dependencies /> 标签集。

    <dependencyManagement>
      <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Hopper-SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    我注意到一些导入在执行此操作时中断,只需在POM中将它们显式地添加为依赖项,一切都应该按预期工作。