Spring - 没有

时间:2017-08-23 16:07:15

标签: spring spring-data-jpa

刚开始学习Spring。 尝试通过创建人员类PersonRepositoryPersonDAOmain来学习JPA。 我已经看过StackOverflow的答案,但我想我做的一切都很好...... 这是例外:

  

线程“main”中的异常org.springframework.beans.factory.NoSuchBeanDefinitionException:没有'beans.PersonDAO'类型的限定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.SrpingDataJPA.main.main(main.java:15)

这是我的课程:

Person.class:

package beans;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="workers")
public class Person {

	@Id
	@Column(name="name")
	private String name;
	
	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}
	
}

PersonRepo.class:

package beans;

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonRepo extends CrudRepository<Person, String>{
	
	 List<Person> findByName(String name);
	
}

PersonDAO.class:

package beans;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class PersonDAO {
	
	@Autowired
	private PersonRepo personRepo;
	
	public PersonDAO() {
	}
	
	public void createPerson(Person person){
		personRepo.save(person);
	}
	
	public List<Person> find(String name){
		return personRepo.findByName(name);
	}
}

main.class:

package com.example.SrpingDataJPA;

import javax.transaction.Transactional;

import org.jboss.jandex.Main;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;

import beans.PersonDAO;

@Transactional
public class main {
	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(Main.class, args);
		PersonDAO personDAO = context.getBean(PersonDAO.class);
		
		System.out.println(personDAO .find("daniel"));
	}
}

任何帮助人员?

3 个答案:

答案 0 :(得分:1)

此处未对PersonDAO进行扫描,请在主要课程中添加@ComponentScan beans个套件,同时忘记向主要课程添加@SpringBootApplication注释。

@ComponentScan("beans")

答案 1 :(得分:0)

将@SpringBootApplication注释放在主类中,它将起作用。

答案 2 :(得分:0)

我认为您需要更多的东西。在做了所有改变后,你被告知,你的课应该看起来像这样。此外,如果您的主类在其他包中(由于某种原因),请扫描包。并启用JPA存储库。

@SpringBootApplication(scanBasePackages = "${com.example.*}")
@EnableJpaRepositories("your.repository.package")
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Main.class, args);
        PersonDAO personDAO = context.getBean(PersonDAO.class);

        System.out.println(personDAO .find("daniel"));
    }
}

不要将存储库自动装配到存储库。这只是感觉不对。 做一个@Component,它也会被spring boot选中:

@Component
public class PersonDAO {

    @Autowired
    private PersonRepo personRepo;

    // your methods
}

另外,如果你使用的是Spring Boot,你可以像下面这样得到你的bean:

@Autowired
private PersonDAO personDAO;

// your code here

@SpringBootApplication注释就像拥有@ComponentScan,@ Configuration和@EnableAutoConfiguration一样。参考here