通过 Spring Data JPA 自动生成 RepositoryImpl 时“无法解析匹配的构造函数" [英] 'Could not resolve matching constructor' when auto-generating RepositoryImpl through Spring Data JPA

查看:25
本文介绍了通过 Spring Data JPA 自动生成 RepositoryImpl 时“无法解析匹配的构造函数"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Spring Data Jpa 自动生成一个类来实现我的存储库.

I'm using Spring Data Jpa to automatically generate a class to implement my repository.

但是当我尝试启动容器时,它告诉我 Error 创建名为 'accountRepository' 的 bean:无法解析匹配的构造函数.

But when I was trying to start the container it told me Error creating bean with name 'accountRepository': Could not resolve matching constructor.

我的账户实体:

package com.amastigote.ssp.model;

import javax.persistence.*;

/**
 * Created by hwding on 3/22/17.
 */
@Entity
@Table(name = "User")
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String nickName;
    private String plainPassword;

    public Account() {
    }

    public Account(String nickName, String plainPassword) {
        this.nickName = nickName;
        this.plainPassword = plainPassword;
    }

    public String getNickName() {
        return nickName;
    }

    public String getPlainPassword() {
        return plainPassword;
    }

    public long getId() {
        return id;
    }

}

Account 的存储库接口:

package com.amastigote.ssp.repo;

import com.amastigote.ssp.model.Account;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * Created by hwding on 3/22/17.
 */
@SuppressWarnings("unchecked")
public interface AccountRepository extends JpaRepository<Account, Long> {
}

Jpa 配置:

package com.amastigote.ssp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

/**
 * Created by hwding on 3/23/17.
 */
@Configuration
@EnableJpaRepositories("com.amastigote.ssp.repo")
public class JPAConf {

    @Bean
    public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(
            DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
                = new LocalContainerEntityManagerFactoryBean();

        localContainerEntityManagerFactoryBean
                .setDataSource(dataSource);
        localContainerEntityManagerFactoryBean
                .setJpaVendorAdapter(jpaVendorAdapter);
        localContainerEntityManagerFactoryBean
                .setPackagesToScan("com.amastigote.ssp.model");

        return localContainerEntityManagerFactoryBean;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter
                = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setDatabase(Database.H2);
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setGenerateDdl(false);

        return hibernateJpaVendorAdapter;
    }

    @Bean
    public JpaTransactionManager jpaTransactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

推荐答案

这个错误信息实际上是模棱两可的,因为我使用的是低版本的 spring-data-jpa(这是由我的 IDE 推荐...).

This error message is ambiguous in fact, for that I'm using a low version of spring-data-jpa (which is recommended by my IDE...).

在我的项目中添加最新版本后,给出了更具体的提示:

After adding the newest version to my project, a more specific hint was given:

error when creating inner bean '...', 
could not found bean named 'entityManagerFactoryBean'.

我注意到我的实体工厂 bean 配置如下:

I noticed that my entity factory bean is configured like:

@Bean
public LocalContainerEntityManagerFactoryBean 
    localContainerEntityManagerFactoryBean(...) {}

默认情况下,它的 bean 名称是localContainerEntityManagerFactoryBean",这与所需的 entityManagerFactoryBean 不匹配.

By default its bean name is 'localContainerEntityManagerFactoryBean', which does not match the demanded entityManagerFactoryBean.

解决方案是将 entityManagerFactoryRef = "localContainerEntityManagerFactoryBean" 添加到您的 @EnableJpaRepositories 中,例如:

The Solution is to add entityManagerFactoryRef = "localContainerEntityManagerFactoryBean" to your @EnableJpaRepositories, like:

@EnableJpaRepositories(
    basePackages = "com.amastigote.ssp.repo",
    entityManagerFactoryRef = "localContainerEntityManagerFactoryBean"
)

这篇关于通过 Spring Data JPA 自动生成 RepositoryImpl 时“无法解析匹配的构造函数"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆