Spring Data JPA(CrudRepository) - BeanCreationException:无法自动装入字段 [英] Spring Data JPA (CrudRepository) - BeanCreationException: Could not autowire field

查看:171
本文介绍了Spring Data JPA(CrudRepository) - BeanCreationException:无法自动装入字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的代码中有这个例外:


线程main中的异常org.springframework.beans.factory.BeanCreationException:创建名为'springJpaContactService'的bean时出错:注入自动装配依赖失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装入字段:private com.sample.hibernate.ContactRepository com.sample.hibernate.RepositoryContactServiceImpl.contactRepository;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'contactRepository'的bean时出错:init方法的调用失败;嵌套异常是java.lang.AbstractMethodError:org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepository(Lorg / springframework / data / repository / core / RepositoryInformation;)Ljava / lang / Object;
在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)

在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
,位于org.springframework.beans.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230 )
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at com.sample。 hibernate.HibernateJpaApplication.main(HibernateJpaApplication.java:15)

有我的类负责CrudRepository:



ContactRepository

  package com.sample.hibernate; 

import java.util.List;

import org.springframework.data.repository.CrudRepository;

公共接口ContactRepository扩展了CrudRepository< Contact,Long> {

列表<联系人> findByFirstName(String firstName);

列表<联系人> findByFirstNameAndLastName(String firstName,String lastName);


RepositoryContactService

  package com.sample.hibernate; 

import java.util.List;

public interface RepositoryContactService {
List< Contact>找到所有();

列表<联系人> findByFirstName(String firstName);

列表<联系人> findByFirstNameAndLastName(String firstName,String lastName);
}

RepositoryContactServiceImpl

  package com.sample.hibernate; 

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

导入com.google.common.collect.Lists;

@Service(springJpaContactService)
@Repository
@Transactional
public class RepositoryContactServiceImpl implements RepositoryContactService {
@Autowired
Contact ContactRepository contactRepository ;

@Transactional(readOnly = true)
public List< Contact> findAll(){
return Lists.newArrayList(contactRepository.findAll());
}

@Transactional(readOnly = true)
public List< Contact> findByFirstName(String firstName){
return contactRepository.findByFirstName(firstName);
}

@Transactional(readOnly = true)
public List< Contact> findByFirstNameAndLastName(String firstName,
String lastName){
return contactRepository
.findByFirstNameAndLastName(firstName,lastName);
}

}

联系人

  package com.sample.hibernate; 

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name =contact)
@NamedQueries({
@NamedQuery(name =Contact.findAll,query =select c from Contact c),
@NamedQuery(name =Contact.findAllWithDetail,query =从联系人c中选择不同的c,左连接获取c.contactTelDetails t左连接获取c.hobbies h),
@NamedQuery(name =Contact.findById,query =从联系人c中选择不同的c左连接fetch c.contactTelDetails t左连接fetch c.hobbies h其中c.id =:id)})
@SqlResultSetMapping(name =contactResult,entities = @ EntityResult(entityClass = Contact.class)

public class Contact实现Serializable {

private static final long serialVersionUID = -8008307767408320097L;
私人长ID;
private int version;
private String firstName;
private String lastName;
私人日期birthDate;
private Set< ContactTelDetail> contactTelDetails = new HashSet< ContactTelDetail>();
私人套装< Hobby> hobbies = new HashSet< Hobby>();

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =ID)
public Long getId(){
返回ID;
}

public void setId(Long id){
this.id = id;


@Version
@Column(name =VERSION)
public int getVersion(){
return version;
}

public void setVersion(int version){
this.version = version;

$ b $ @Column(name =FIRST_NAME)
public String getFirstName(){
return firstName;
}

public void setFirstName(String firstName){
this.firstName = firstName;


@Column(name =LAST_NAME)
public String getLastName(){
return lastName;
}

public void setLastName(String lastName){
this.lastName = lastName;
}

@Temporal(TemporalType.DATE)
@Column(name =BIRTH_DATE)
public Date getBirthDate(){
return birthDate;
}

public void setBirthDate(Date birthDate){
this.birthDate = birthDate;
}

@OneToMany(mappedBy =contact,cascade = CascadeType.ALL,orphanRemoval = true)
public Set< ContactTelDetail> getContactTelDetails(){
return contactTelDetails;
}

public void setContactTelDetails(Set< ContactTelDetail> contactTelDetails){
this.contactTelDetails = contactTelDetails;
}

public void addContactTelDetail(ContactTelDetail contactTelDetail){
contactTelDetail.setContact(this);
getContactTelDetails()。add(contactTelDetail);
}

public void removeContactTelDetail(ContactTelDetail contactTelDetail){
getContactTelDetails()。remove(contactTelDetail);

$ b @ManyToMany
@JoinTable(name =contact_hobby_detail,joinColumns = @JoinColumn(name =CONTACT_ID),inverseJoinColumns = @JoinColumn(name =HOBBY_ID ))
public Set< Hobby> getHobbies(){
return hobbies;


public void setHobbies(Set< Hobby> hobbies){
this.hobbies = hobbies;

$ b @Override
public String toString(){
returnContact [id =+ id +,version =+ version +,firstName =
+ firstName +,lastName =+ lastName +,birthDate =
+ birthDate +];
}

}

app-config。 xml

 <?xml version =1.0encoding =UTF-8?> 
< beans xmlns =http://www.springframework.org/schema/beans
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instancexmlns :context =http://www.springframework.org/schema/context
xmlns:tx =http://www.springframework.org/schema/txxmlns:p =http:// www.springframework.org/schema/p
xmlns:jpa =http://www.springframework.org/schema/data/jpaxmlns:jdbc =http://www.springframework.org/ schema / jdbc
xmlns:util =http://www.springframework.org/schema/util
xsi:schemaLocation =
http://www.springframework.org/ schema / jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/data/jpa
http ://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org /schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springfram ework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd\">

< jdbc:embedded-database id =dataSourcetype =H2>
< jdbc:script location =classpath:sql / schema.sql/>
< jdbc:script location =classpath:sql / test-data.sql/>
< / jdbc:embedded-database>

< bean id =transactionManagerclass =org.springframework.orm.jpa.JpaTransactionManager>
< property name =entityManagerFactoryref =emf/>
< / bean>

< tx:注解驱动的事务管理器=transactionManager/>

< bean id =emf
class =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
< property name =dataSourceref =dataSource/>
< property name =jpaVendorAdapter>
< bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter/>
< / property>
< property name =packagesToScanvalue =com.sample.hibernate/>
< property name =jpaProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.H2Dialect< / prop>
< prop key =hibernate.max_fetch_depth> 3< / prop>
< prop key =hibernate.jdbc.fetch_size> 50< / prop>
< prop key =hibernate.jdbc.batch_size> 10< / prop>
< prop key =hibernate.show_sql> false< / prop>
< /道具>
< / property>
< / bean>

< context:component-scan base-package =com.sample.hibernate/>

< jpa:repositories base-package =com.sample.hibernate
entity-manager-factory-ref =emftransaction-manager-ref =transactionManager/> ;
< / beans>

我会为任何线索感到高兴..这个例子来自一本书,我已经检查过3次与它+在线教程,我不知道为什么它不按预期工作...

解决方案

注释的一切都很好 - 无需将@Repository移动到ContactRepository。这是因为ContactRepository扩展了CrudRepository,它告诉Spring他可以在RepositoryContactServiceImpl中自动引用参考。问题出现在maven配置中(正如你正确思考并感谢那样)。我改变了:

 < parent> 
< groupId> org.springframework.boot< / groupId>
< artifactId> spring-boot-starter-parent< / artifactId>
< version> 1.3.0.M2< / version>
< relativePath /> <! - 从存储库查找父级 - >
< / parent>

 <亲本GT; 
< groupId> org.springframework.boot< / groupId>
< artifactId> spring-boot-starter-parent< / artifactId>
< version> 1.0.2.RELEASE< / version>
< relativePath /> <! - 从存储库查找父级 - >
< / parent>

现在存储库按预期工作。


I am trying to use Spring Data JPA - CrudRepository use without any implementation (all default options).

With my code I am having this exception:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springJpaContactService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sample.hibernate.ContactRepository com.sample.hibernate.RepositoryContactServiceImpl.contactRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'contactRepository': Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepository(Lorg/springframework/data/repository/core/RepositoryInformation;)Ljava/lang/Object; at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at com.sample.hibernate.HibernateJpaApplication.main(HibernateJpaApplication.java:15)

There are my classes responsible for CrudRepository:

ContactRepository:

package com.sample.hibernate;

import java.util.List;

import org.springframework.data.repository.CrudRepository;

public interface ContactRepository extends CrudRepository<Contact, Long> {

    List<Contact> findByFirstName(String firstName);

    List<Contact> findByFirstNameAndLastName(String firstName, String lastName);

}

RepositoryContactService:

package com.sample.hibernate;

import java.util.List;

public interface RepositoryContactService {
    List<Contact> findAll();

    List<Contact> findByFirstName(String firstName);

    List<Contact> findByFirstNameAndLastName(String firstName, String lastName);
}

RepositoryContactServiceImpl:

package com.sample.hibernate;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.google.common.collect.Lists;

@Service("springJpaContactService")
@Repository
@Transactional
public class RepositoryContactServiceImpl implements RepositoryContactService {
    @Autowired
    private ContactRepository contactRepository;

    @Transactional(readOnly = true)
    public List<Contact> findAll() {
        return Lists.newArrayList(contactRepository.findAll());
    }

    @Transactional(readOnly = true)
    public List<Contact> findByFirstName(String firstName) {
        return contactRepository.findByFirstName(firstName);
    }

    @Transactional(readOnly = true)
    public List<Contact> findByFirstNameAndLastName(String firstName,
            String lastName) {
        return contactRepository
                .findByFirstNameAndLastName(firstName, lastName);
    }

}

Contact:

package com.sample.hibernate;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "contact")
@NamedQueries({
        @NamedQuery(name="Contact.findAll", query="select c from Contact c"),
        @NamedQuery(name = "Contact.findAllWithDetail", query = "select distinct c from Contact c left join fetch c.contactTelDetails t left join fetch c.hobbies h"),
        @NamedQuery(name = "Contact.findById", query = "select distinct c from Contact c left join fetch c.contactTelDetails t left join fetch c.hobbies h where c.id = :id") })
@SqlResultSetMapping(name="contactResult", entities=@EntityResult(entityClass=Contact.class)
)
public class Contact implements Serializable {

    private static final long serialVersionUID = -8008307767408320097L;
    private Long id;
    private int version;
    private String firstName;
    private String lastName;
    private Date birthDate;
    private Set<ContactTelDetail> contactTelDetails = new HashSet<ContactTelDetail>();
    private Set<Hobby> hobbies = new HashSet<Hobby>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(name = "VERSION")
    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    @Column(name = "FIRST_NAME")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Column(name = "LAST_NAME")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "BIRTH_DATE")
    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    @OneToMany(mappedBy = "contact", cascade = CascadeType.ALL, orphanRemoval = true)
    public Set<ContactTelDetail> getContactTelDetails() {
        return contactTelDetails;
    }

    public void setContactTelDetails(Set<ContactTelDetail> contactTelDetails) {
        this.contactTelDetails = contactTelDetails;
    }

    public void addContactTelDetail(ContactTelDetail contactTelDetail) {
        contactTelDetail.setContact(this);
        getContactTelDetails().add(contactTelDetail);
    }

    public void removeContactTelDetail(ContactTelDetail contactTelDetail) {
        getContactTelDetails().remove(contactTelDetail);
    }

    @ManyToMany
    @JoinTable(name = "contact_hobby_detail", joinColumns = @JoinColumn(name = "CONTACT_ID"), inverseJoinColumns = @JoinColumn(name = "HOBBY_ID"))
    public Set<Hobby> getHobbies() {
        return hobbies;
    }

    public void setHobbies(Set<Hobby> hobbies) {
        this.hobbies = hobbies;
    }

    @Override
    public String toString() {
        return "Contact [id=" + id + ", version=" + version + ", firstName="
                + firstName + ", lastName=" + lastName + ", birthDate="
                + birthDate + "]";
    }

}

app-config.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:p="http://www.springframework.org/schema/p"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

    <jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath:sql/schema.sql" />
        <jdbc:script location="classpath:sql/test-data.sql" />
    </jdbc:embedded-database>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="emf" />
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean id="emf"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="packagesToScan" value="com.sample.hibernate" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
                <prop key="hibernate.max_fetch_depth">3</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.jdbc.batch_size">10</prop>
                <prop key="hibernate.show_sql">false</prop>
            </props>
        </property>
    </bean>

    <context:component-scan base-package="com.sample.hibernate" />

    <jpa:repositories base-package="com.sample.hibernate"
        entity-manager-factory-ref="emf" transaction-manager-ref="transactionManager" />
</beans>

I would be glad for any clue.. This example is from a book and I checked 3 times already with it + online tutorials and I have no clue why it is not working as expected...

解决方案

Everything with annotations were fine - no need to move @Repository to ContactRepository. This is because ContactRepository extends CrudRepository which tells Spring that he can autowire with reference in RepositoryContactServiceImpl. Problem was in maven configuration (as You were thinking correctly and thanks for that). I changed:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.M2</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

to

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.0.2.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

and now repository works as expected.

这篇关于Spring Data JPA(CrudRepository) - BeanCreationException:无法自动装入字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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