需要一个类型为' com.example.dao.InterfaceName'的bean。无法找到

时间:2017-08-28 14:20:59

标签: maven spring-boot spring-data spring-data-jpa

我正在使用Eclipse和maven与Java 1.8尝试构建一个基于maven项目的Spring启动项目,因此我构建了自己的Entity underName Candidat使用此完整代码块

package com.example.demo.entities;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity(name = "CandidatTable")
public class Candidat implements Serializable {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private String prenom;
    private String reference;
    private String resumeCandidate;

    public Candidat() {
        super();
    }

    public Candidat(String name, String prenom, String reference, String resumeCandidate) {
        super();
        this.name = name;
        this.prenom = prenom;
        this.reference = reference;
        this.resumeCandidate = resumeCandidate;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getReference() {
        return reference;
    }

    public void setReference(String reference) {
        this.reference = reference;
    }

    public String getResumeCandidate() {
        return resumeCandidate;
    }

    public void setResumeCandidate(String resumeCandidate) {
        this.resumeCandidate = resumeCandidate;
    }

}

在正常情况下,我们应该在其中构建一个接口,我们应该像我们所说的那样定义我们的服务方法:save()findAllRecords()findSpecificRecordByID()updateRecordLine(),{{1等等,但在我的情况下,我在我的maven项目中使用了Spring-data,在我的web.xml文件中我有这种依赖:

deleteRecord()

所以没有必要定义我们的方法,因为Spring-data在我们创建扩展Generic Interface <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> 的接口的情况下使用它自己的方法,所以我的界面看起来像这样:

JpaRepository

最后,主类代码就是这个:

package com.example.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entities.Candidat;

public interface ICandidate extends JpaRepository<Candidat, Long>{
//no need to define our methods, because we gonna use methods difined 
// by SpringData whose comes from JPA specification.
}

我的应用程序应该转好,查看web.xml以管理应用程序依赖性,然后查看包含包含此代码的文件package com.example.demo; import java.util.List; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import com.example.dao.ICandidate; import com.example.demo.entities.Candidat; @SpringBootApplication public class CatWebServiceApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(CatWebServiceApplication.class, args); ICandidate condidateRep = context.getBean(ICandidate.class); condidateRep.save( new Candidat("UserName_1", "FirstName_1", "Ref_1", "/Home/file/docFile_1.docx")); //insert data using Ioc later after runing urself condidateRep.save( new Candidat("UserName_2", "FirstName_2", "Ref_2", "/Home/file/docFile_2.docx")); List<Candidat> cnds = condidateRep.findAll(); cnds.forEach(p-> System.out.println(p.getResumeCandidate())); } } 的路径src/main/resources

application.properties

我突然在eclipse控制台上收到此错误消息:

  

线程中的异常&#34; main&#34;   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   属于&#39; # DataSource settings: spring.datasource.url = jdbc:mysql://localhost:3306/softherWebService spring.datasource.username = root spring.datasource.password = dbPassword spring.datasource.driverClassName = com.mysql.jdbc.Driver # Specify the DBMS spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect &#39;的限定bean可在   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)     在   org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090)     在   com.example.demo.CatWebServiceApplication.main(CatWebServiceApplication.java:19)

所以getBean()行中的问题,我也使用了CommandLineRunner但是没有解决我在获取bean时遇到的问题。

2 个答案:

答案 0 :(得分:0)

使用自动隐含@SpringBootApplication@ComponentScan时。 RadComboBox的默认行为是,当未明确定义@ComponentScan时,是从已定义的类开始扫描包。对于Spring Boot,这也适用于所有其他自动配置,如检测实体,检测Spring Data存储库等。

现在,basePackages中的CatWebServiceApplicationcom.example.demo中的ICandidate定义后者将不会被扫描,因为它不属于{{1}包裹。

有几种方法可以解决这个问题。

首先,您可以在com.example.dao上指定com.example.demo以检测到组件,但这不会解决此问题,因为您还需要scanBasePackages@SpringBootApplication在扩展技术时还需要更多。

最简单,最推荐的方法是将@EnableJpaRepositories("com.example.dao")放在@EntityScan("com.example.dao")包中,以便涵盖所有子包,您无需考虑所有其他注释需要补充。

答案 1 :(得分:0)

在界面定义上方添加@Repository批注以解决错误。