【问题标题】:STS + Spring Data JPA + Hibernate repositories XML config issueSTS + Spring Data JPA + Hibernate 存储库 XML 配置问题
【发布时间】:2014-05-02 19:31:11
【问题描述】:

我在 STS 中遇到一个问题,它在引用 jpa:repositories 节点时在我的 context.xml 文件中显示错误。它不会阻止应用程序运行(实际上似乎运行良好),但我无法让错误消失。

错误:

Error occured processing XML 'Class
org/springframework/data/repository/config/RepositoryComponentProvider illegally 
accessing "package private" member of class org/springframework/context/
annotation/AnnotationConfigUtils'. See Error Log for more details

有问题的 XML 段:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <tx:annotation-driven transaction-manager="transactionManagerSpecial" />
    <jpa:repositories base-package="com.testcompany.**.repository" transaction-manager-ref="transactionManagerSpecial"></jpa:repositories>

Spring 版本(core/tx/beans/test/aop/context/expression):4.0.2.RELEASE

Spring Data JPA 版本:1.5.0.RELEASE

休眠版本(不知道为什么这很重要):4.2.1.Final

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.spring</groupId>
<artifactId>test-spring-transactional</artifactId>
<version>1.0.1</version>
<packaging>jar</packaging>
<name>Spring Transactional Test Project</name>
<url>http://www.imatestapp.com</url>
<description>This project is a minimal jar utility with Spring configuration for Hibernate set up.</description>
<properties>
    <maven.test.failure.ignore>true</maven.test.failure.ignore>
    <spring.framework.version>4.0.2.RELEASE</spring.framework.version>
    <hibernate.version>4.2.1.Final</hibernate.version>
    <spring.framework.data.version>1.5.0.RELEASE</spring.framework.data.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.framework.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>${spring.framework.data.version}</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

依赖树(更新到 Spring Data 1.5.2,还是同样的问题):

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-spring-transactional ---
[INFO] com.test.spring.template:test-spring-transactional:jar:1.0.1
[INFO] +- org.hibernate:hibernate-entitymanager:jar:4.3.5.Final:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] |  +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:4.3.5.Final:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  \- org.jboss:jandex:jar:1.1.0.Final:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.4.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] |  \- org.javassist:javassist:jar:3.18.1-GA:compile
[INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] +- org.springframework:spring-test:jar:4.0.2.RELEASE:test
[INFO] |  \- org.springframework:spring-core:jar:4.0.2.RELEASE:compile
[INFO] |     \- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] +- org.springframework:spring-context-support:jar:4.0.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-beans:jar:4.0.2.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.0.2.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-orm:jar:4.0.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-jdbc:jar:4.0.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-tx:jar:4.0.2.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:4.0.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-expression:jar:4.0.2.RELEASE:compile
[INFO] +- org.springframework.data:spring-data-jpa:jar:1.5.2.RELEASE:compile
[INFO] |  +- org.springframework.data:spring-data-commons:jar:1.7.2.RELEASE:compile
[INFO] |  +- org.aspectj:aspectjrt:jar:1.7.4:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.6:compile
[INFO] |  \- org.slf4j:jcl-over-slf4j:jar:1.7.6:runtime
[INFO] +- commons-dbcp:commons-dbcp:jar:1.2.2:compile
[INFO] |  \- commons-pool:commons-pool:jar:1.3:compile
[INFO] \- log4j:log4j:jar:1.2.16:compile

**根据以下响应更新到 Spring Data JPA 1.5.2**

更新到 JPA 1.5.2“可能”已经解决了上述问题(因为 XML 不再抱怨引用私有方法),但仍然存在引用问题。现在我的存储库找不到 JpaRepository 引用的“PagingAndSorting”存储库(尽管它可以找到 JpaRepository 本身):

package com.fedins.template.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.fedins.template.model.Account;

public interface AccountRespository extends JpaRepository<Account, String> {

}

此界面有2个错误:

(base class error)
The type org.springframework.data.domain.Sort cannot be resolved. It is indirectly referenced from required .class files 

(error on JpaRepository declaration)
The type org.springframework.data.repository.PagingAndSortingRepository cannot be resolved. It is indirectly referenced from required .class files

**最终更新** 上面的问题是本地 Maven 存储库的问题。解决这个问题后,我最终得到了一个干净的项目......除了 jpa:repositories 元素上的最终错误:

AnnotationConfigUtils.processCommonDefinitionAnnotations(…) is not public! Make sure you're using Spring 3.2.5 or better. The class was loaded from file:/C:/Program Files/STS/3.4/plugins/org.springframework.context_4.0.0.20130829-M3.jar.:org.springframework.context.annotation.AnnotationConfigUtils.processCommonDefinitionAnnotations(org.springframework.beans.factory.annotation.AnnotatedBeanDefinition)

经过一番搜索,我发现这可能是 STS 3.4 的问题:https://jira.spring.io/i#browse/DATAJPA-490 我将升级到 STS 3.5 看看它是否能解决问题。

【问题讨论】:

  • 请添加mvn dependency:tree的输出。

标签: java spring jpa spring-data spring-tool-suite


【解决方案1】:

这肯定是由于您的类路径设置不正确。我们尝试使用的相关方法是来自 Spring Context 的AnnotationConfigUtils.processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd)。此方法已在 3.2.5 和 4.0.0 版本中公开。因此,如果您的类路径按照您描述的方式设置,则不会发生异常。

我建议升级到 Spring Data JPA 的更新版本(1.5.2.RELEASE 是撰写本文时的最新版本),因为我们引入了 dedicated check 用于当前和公开的方法,以提供更好的比你目前得到的例外。

可能其他一些库会在旧版本中引入 Spring JAR,但默认情况下,Spring Data 项目肯定会引入与该库兼容的 Spring 版本。

【讨论】:

  • 非常感谢您的反馈。我同意您可能是对的,尽管我无法找到“问题”可能发生的位置,因为据我所见,POM 似乎是正确的......我已经上传了上面的 POM(顶部的一些名称已更改保护无辜者)。您是否看到任何明显的问题?
  • 它自己的pom非常有限。您介意添加mvn dependency:tree 的输出吗?升级到上述版本应该明确指向有问题的 JAR。
  • 上面添加的依赖项。再次感谢您。
  • 更新到 1.5.2 可能已经解决了 POM 问题,但我仍然觉得存在依赖问题。我在上面提供了更新。
  • 我认为数据 JPA 的更新解决了上一个问题(上面提到,除了我遇到的其他问题)。再次感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2018-01-03
  • 2016-04-09
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多