“IllegalArgumentException:必须存在至少一个 JPA 元模型” - 尝试将应用程序同时连接到 mongo 和 sql 时

Posted

技术标签:

【中文标题】“IllegalArgumentException:必须存在至少一个 JPA 元模型” - 尝试将应用程序同时连接到 mongo 和 sql 时【英文标题】:"IllegalArgumentException: At least one JPA metamodel must be present" - when trying to connect application both to mongo and sql 【发布时间】:2018-02-08 07:16:23 【问题描述】:

我们有一个 Spring 应用程序可以毫无问题地连接到 MongoDB,使用 @Autowire 和其他所有功能。

现在我们还需要应用程序将连接到 SQL 数据库。

所以我们创建了一个 @entity 类:

@Entity(name = "SqlCarRecord")
@Table(name = "Cars")
final public class SqlCarRecord 

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "name", nullable = false)
private String name;
....

还有一个@repository接口:

@Repository 
public interface SqlCarsRepository extends JpaRepository<SqlCarRecord, Long> 
...

还有一个 @Configuraion 类,例如这里的示例 https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-one-configuration/

并且在我们添加的 applicationContext &lt;jpa:repositories base-package="path.to.interface.package" /&gt;

pom.xml 我们已经有了

        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.5.RELEASE</version>
    </dependency>

我们补充说:

        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.0.0.M3</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>javax.persistence</artifactId>
        <version>2.1.0</version>
    </dependency>

    <!-- DataSource (HikariCP) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.6.2</version>
    </dependency>

    <!-- JPA Provider (Hibernate) -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.11.6.RELEASE</version>
    </dependency>

    <!-- adding this to avoid "java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal" -->
    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>1.4.01</version>
    </dependency>

    <!-- adding this to avoid "ClassNotFoundException: org.springframework.data.util.CloseableIterator" -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>1.13.6.RELEASE</version>
    </dependency>

在我们添加的 @Service 类中:

    ....

    @Autowired
    private SqlCarsRepository carsRepository;

项目构建成功,但是当我们尝试运行它时,我们得到这个错误:

Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'jpaMappingContext': Invocation of init method failed; nested 
exception is java.lang.IllegalArgumentException: At least one JPA metamodel 
must be present!

我们尝试过的一些事情:

在pom中更改不同版本的spring, 我们试图评论其中一些, 我们尝试更改接口以扩展CrudRepository, 试图向实体和其他一些东西添加一个空的构造函数

没有运气。

将提供帮助。

提前致谢。

【问题讨论】:

【参考方案1】:

我通过将@SpringBootApplication 注解更改为这样解决了相同的错误消息:

@SpringBootApplication(exclude = JndiConnectionFactoryAutoConfiguration.class,DataSourceAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,JpaRepositoriesAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class)

如果你直接使用@EnableAutoConfiguration,试试这个:

@EnableAutoConfiguration(exclude = JndiConnectionFactoryAutoConfiguration.class,DataSourceAutoConfiguration.class,
                                    HibernateJpaAutoConfiguration.class,JpaRepositoriesAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class)

似乎根本问题是 Spring Boot 试图添加已经在类路径中的东西。

大部分答案来自https://***.com/a/30597861/7470360

【讨论】:

以上是关于“IllegalArgumentException:必须存在至少一个 JPA 元模型” - 尝试将应用程序同时连接到 mongo 和 sql 时的主要内容,如果未能解决你的问题,请参考以下文章

IllegalArgumentException:无效的列纬度

Retrofit-IllegalArgumentException:意外的 url

引起:java.lang.IllegalArgumentException:属性'driverClassName'不能为空

IllegalArgumentException:接收方未注册

IllegalArgumentException 介绍

java.lang.IllegalArgumentException:基本 URI 不能为空