刚开始学习Spring。
尝试通过创建人员类PersonRepository
,PersonDAO
和main
来学习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"));
}
}
任何帮助人员?
答案 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