“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
<jpa:repositories base-package="path.to.interface.package" />
在 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'不能为空