使用Spring Data Repositories和MongoDB设置Spring应用程序

5
我在定义mongo存储库时遇到了问题,出现了以下xml中的错误:

Error occurred processing XML tried to access method org.springframework.context.annotation.AnnotationConfigUtils.processCommonDefinitionAnnotations (Lorg/springframework/beans/factory/annotation/AnnotatedBeanDefinition;)V from class org.springframework.data.repository.config.RepositoryComponentProvider'. See Error Log for more details servlet-context.xml /master/WebContent/WEB-INF/config line 24 Spring Beans Problem

我附上了环境的截图以供参考。我使用的是eclipse Kepler版本,并且pom属性文件如下:
<java-version>1.7</java-version>
<org.springframework-version>4.0.1.RELEASE</org.springframework-version>
<org.jackson-version>2.3.0</org.jackson-version>
<spring-data-mongodb>1.4.0.RELEASE</spring-data-mongodb>

Spring data commons版本为1.7,spring data mongo db版本为1.4。当我打开上下文XML时,我在Eclipse项目中看到错误。

有趣的是,我有另一个工程运行良好。唯一的区别是它没有spring MVC和jackson二进制文件,否则它是相似的工程。

异常堆栈跟踪:

!ENTRY org.springframework.ide.eclipse.beans.core 1 0 2014-03-01 00:04:11.839 !MESSAGE 处理'/master/WebContent/WEB-INF/config/servlet-context.xml'时发生错误!STACK 0 java.lang.IllegalAccessError: 尝试访问来自类org.springframework.data.repository.config.RepositoryComponentProvider的方法org.springframework.context.annotation.AnnotationConfigUtils.processCommonDefinitionAnnotations(Lorg/springframework/beans/factory/annotation/AnnotatedBeanDefinition;)V at org.springframework.data.repository.config.RepositoryComponentProvider.findCandidateComponents(RepositoryComponentProvider.java:121) at org.springframework.data.repository.config.RepositoryConfigurationSourceSupport.getCandidates(RepositoryConfigurationSourceSupport.java:69) at org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport.getRepositoryConfigurations(RepositoryConfigurationExtensionSupport.java:54) at org.springframework.data.repository.config.RepositoryConfigurationDelegate.registerRepositoriesIn(RepositoryConfigurationDelegate.java:88) at org.springframework.data.repository.config.RepositoryBeanDefinitionParser.parse(RepositoryBeanDefinitionParser.java:67) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) at org.springframework.ide.eclipse.beans.core.internal.model.namespaces.DelegatingNamespaceHandlerResolver$ElementTrackingNamespaceHandler.parse(DelegatingNamespaceHandlerResolver.java:177) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1427) at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$ErrorSuppressingBeanDefinitionParserDelegate.parseCustomElement(BeansConfig.java:1400) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1417) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:187) at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$ToolingFriendlyBeanDefinitionDocumentReader.doRegisterBeanDefinitions(BeansConfig.java:1330) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:494) at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$2.registerBeanDefinitions(BeansConfig.java:402) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335) at org.springframework.ide.eclipse.beans.core.internal.model.BeansConfig$2.loadBeanDefinitions(BeansConfig.java:388) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)

servlet context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!-- Enables the Spring MVC @Controller programming model -->
    <mvc:annotation-driven />


    <context:component-scan base-package="com.xxxx.yyyyy" />

    <!-- Mongo DB Configuration -->
    <mongo:mongo id="mongo" host="monopolyvm3" port="27017" />
    <mongo:db-factory dbname="test" mongo-ref="mongo" />
    <mongo:db-factory id="mongoDbFactory" dbname="cloud" mongo-ref="mongo" />
    <mongo:repositories base-package="com.xxxx.yyyyy" />

    <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />

    <bean id="defaultMongoTypeMapper"
        class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
        <constructor-arg name="typeKey"><null/></constructor-arg>
    </bean>

    <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
        <constructor-arg name="mappingContext" ref="mappingContext" />
        <property name="typeMapper" ref="defaultMongoTypeMapper" />
    </bean>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongoDbFactory" />
        <constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
        <property name="writeConcern" value="SAFE" />
    </bean>




</beans>

以下行出现了错误...


你的错误都涉及到servlet-context.xml。顺便把application-context.xml也粘贴上来。 - Emerson Farrugia
5个回答

13
在我的情况下,导致问题的是Spring Data JPA版本。 我没有使用Spring Data MongoDB而是使用了Spring Data JPA。 我使用的是最新版本(spring-framework 4.0.2.RELEASE、spring-data-jpa 1.5.0.RELEASE)。我确保Maven中来自Spring和Spring Data方面的所有传递依赖项均为最新版本,但没有解决问题。
尝试将Spring版本降级为4.0.0.RELEASE,但仍然没有成功。 我甚至在工作区内探索了spring-context-4.0.2.RELEASE.jar(以及spring-context-4.0.0.RELEASE.jar)中的org.springframework.context.annotation.AnnotationConfigUtils类,并确认确实processCommonDefinitionAnnotations是一个公共方法,因此IllegalAccessError不能是来自这些jar的问题。
最后,我将Spring Data JPA从1.5.0.RELEASE降级到了1.4.4.RELEASE,然后Maven更新就解决了所有问题。 我正在使用STS 3.4,如果有帮助的话。
由于这是我在谷歌上找到的第一篇文章,所以我想在这里发布它,以便其他遇到同样问题的人可以通过这个提示潜在地解决它。 我已经在https://jira.springsource.org/browse/DATAJPA-490上打开了错误报告。
@Oliver,我尝试了建议的依赖管理,但没有成功。 我已经将dependency:list输出添加到错误报告中。

2

最后,我将Spring的jar版本更改为4.0.0,然后从Maven存储库中删除了所有Spring的jar文件,并尝试重新构建(首先更新了Maven)...它成功了。我非常确定它也可以使用4.0.1的Spring jar文件。(我有另一个配置相同的项目,使用4.0.1的jar文件运行正常:))我认为这个问题归因于Maven和Eclipse。有些问题我完全不知道原因。


1

请确保不会意外将旧的Spring版本(3.2.5之前的版本)加入类路径中。旧的方法没有在异常公共方法列表中列出。这就导致了异常。我建议使用以下Maven配置片段,强制所有Spring库都使用4.0.2:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-framework-bom</artifactId>
      <version>4.0.2.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

0

0

我遇到了同样的问题。在花费数小时与问题作斗争后,@Avnish的答案指引了我正确的方向。更具体地说,他在https://jira.springsource.org/browse/DATAJPA-490上开启的问题真正解决了我的困惑。

Spring-Data-JPA 1.5.1.BUILD-SNAPSHOT或1.6.0.BUILD-SNAPSHOT有一个保护机制,可以准确指出哪个jar包导致了问题。

在我的情况下,我使用的是Eclipse Juno(4.2)和Spring IDE 3.4.0,这导致了问题的出现。我不得不升级到Spring IDE 3.5.0才能解决这个问题。我必须使用http://dist.springsource.com/snapshot/TOOLS/nightly/e4.2更新站点将Juno更新为Spring IDE 3.5.0。

另外,STS 3.5.0RC1及以上版本也可以解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接